• 26.XML


    XML

            可扩展标记语言

            它是一种标记语言 很类似HTML,HTML文件也是XML文档

    XML 与 HTML 区别差异

            1.xml标签都是自定义,html标签是预定义

            2.xml语法严格,html语法松散

            3.xml是存储数据的,html是展示数据

    存储数据格式:

    1. <?xml version="1.0" encoding="UTF-8" ?>
    2. <students>
    3. <student id="001">
    4. <name>大珍珠</name>
    5. </student>
    6. <student id="002">
    7. <name>小珍珠</name>
    8. </student>
    9. </students>

    配置文件格式:

    1. <?xml version="1.0" encoding="UTF-8" ?>
    2. <beans>
    3. <bean classname="com.dzz.bean.User">
    4. <property name="username" value="jack"></property>
    5. </bean>
    6. </beans>

    xml注意点事项:

            标签由一对尖括号+合法标识符组成        <student>

            标签必须成对出现        <student></student>

            特殊的标签可以不成对称自闭和标签,但是必须有结束标记        <address/>

            标签中可以定义属性,属性和标签名空格隔开属性值必须用引号引起来

            <student id="1" name="大珍珠"></student>

            标签嵌套

            <student id="1">

                    <name>大珍珠</name>

            </student>

    xml规则:

            xml文件后缀名:xml

            文档声明必须是第一行第一列(定格)

                    version:版本

                    encoding:字符编码

            必须存在根标签,有且只能有一个

    注释:

            ctrl+shift+/

    特殊字符:

    方式一 转译:

            &lt;        <    小于
            &gt;        >    大于
            &amp;    &    和号
            &apos;    '    单引号
            &quot;    "    引号

    方式二 DATA区:

            <![CDATA[   …内容…  ]]> IDEA:CD生成

    XML约束

            XML约束主要分2类 DTD Schema 两种约束技术,用来限定xml文件可使用的标签以及属性,也就是告诉程序员xml如何编写

    DTD约束

            引入DTD约束

    1.引入本地dtd
            <!DOCTYPE 根元素名称 SYSTEM "DTD文件的路径">
    2.在xml文件内部引入
            <!DOCTYPE 根元素名称 [ dtd文件内容 ]>
    3.引入网络dtd
            <!DOCTYPE 根元素的名称 PUBLIC "DTD文件名称" "DTD文档的URL">

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <!--
    3. 传智播客DTD教学实例文档。
    4. 模拟spring规范,如果开发人员需要在xml使用当前DTD约束,必须包括DOCTYPE。
    5. 格式如下:
    6. <!DOCTYPE beans SYSTEM "bean.dtd">
    7. -->
    8. <!ELEMENT beans (bean*,import*) >
    9. <!ELEMENT bean (property*)>
    10. 复杂元素:
    11. 直接写子元素名称。
    12. 多个子元素可以使用","或者"|"隔开;
    13. ","表示定义子元素的顺序 ;
    14. "|": 表示子元素只能出现任意一个
    15. 简单元素:
    16. EMPTY: 表示标签体为空
    17. ANY: 表示标签体可以为空也可以不为空
    18. PCDATA: 表示该元素的内容部分为字符串
    19. <!ELEMENT property (#PCDATA)>
    20. 属性的类型:
    21. CDATA类型:普通的字符串
    22. <!ELEMENT import (#PCDATA)>
    23. <!ATTLIST bean id CDATA #REQUIRED
    24. className CDATA #REQUIRED
    25. >
    26. 属性的约束:
    27. #REQUIRED: 必须的
    28. #IMPLIED: 属性不是必需的
    29. #FIXED value:属性值是固定的
    30. <!ATTLIST property name CDATA #REQUIRED
    31. value CDATA #REQUIRED
    32. >
    33. <!ATTLIST import resource CDATA #REQUIRED>

    Schema约束

            引入Schema约束

    1. <beans xmlns="http://www.itcast.cn/bean"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://www.itcast.cn/bean bean-schema.xsd"
    4. >

    解析原理图


    Schema和dtd的区别

            1. schema约束文件也是一个xml文件,符合xml的语法,这个文件的后缀名.xsd
            2.一个xml中可以引用多个schema约束文件,多个schema使用名称空间区分(名称空间类似于java包名)
            3.dtd里面元素类型的取值比较单一常见的是PCDATA类型,但是在schema里面可以支持很多个数据类型
            4.schema语法更加的复杂

    XML解析 

    dom4j解析

    1. /*
    2. 第三方工具(jar包)dom4j:
    3. 作用: 以dom的方式,解析xml文件
    4. 使用:
    5. 1.导入jar包
    6. 2.api的介绍
    7. SaxReader类
    8. 空参构造: public SaxReader(){} 可以直接创建对象
    9. public Document read(InputStream is): 加载xml文档到内存,生成一个Document对象
    10. public Element getRootElement(): 获得根元素
    11. public List<Element> elements(…): 获得指定名称的所有子元素。可以不指定名称
    12. public String attributeValue(String attributeName): 获得指定属性名的属性值
    13. public String getText(): 获得当前元素的文本内容
    14. 解析xml文件的步骤:
    15. 1.创建dom4j核心类SaxReader类的对象
    16. 2.dom4j核心类SaxReader类的对象调用read方法,加载xml文件获取对应的Document对象
    17. 3.获取根标签beansElement
    18. 4.获取根标签beansElement中的所有bean子标签,存储List集合对象beanElements
    19. 5.增强for遍历List集合对象beanElements
    20. 5.1 循环内部获取当前bean标签的id和className的属性值
    21. 5.2 循环内部输出5.1中获取的属性值
    22. 5.3 获取当前bean标签的所有property子标签,存储List集合对象propertyElements
    23. 5.4 增强for遍历List集合对象propertyElements
    24. 5.4.1 循环内部获取当前property标签的name和value的属性值,以及文本内容
    25. 5.4.2 循环内部输出5.4.1中获取的属性值及文本内容
    26. */
    27. public class Demo01ParseXml {
    28. public static void main(String[] args) throws Exception {
    29. //1.创建dom4j核心类SaxReader类的对象
    30. SAXReader saxReader = new SAXReader();
    31. //使用类加载器获取xml文件对应的字节输入流对象
    32. InputStream is = Demo01ParseXml.class.getClassLoader().getResourceAsStream("beans.xml");
    33. //2.dom4j核心类SaxReader类的对象调用read方法,加载xml文件获取对应的Document对象
    34. Document document = saxReader.read(is);
    35. //3.获取根标签beansElement
    36. Element beansElement = document.getRootElement();
    37. //4.获取根标签beansElement中的所有bean子标签,存储List集合对象beanElements
    38. List<Element> beanElements = beansElement.elements();
    39. //5.增强for遍历List集合对象beanElements
    40. for (Element beanElement : beanElements) {
    41. //5.1 循环内部获取当前bean标签的id和className的属性值
    42. String id = beanElement.attributeValue("id");
    43. String className = beanElement.attributeValue("className");
    44. //5.2 循环内部输出5.1中获取的属性值
    45. System.out.println(id + "::::" + className);
    46. //5.3 获取当前bean标签的所有property子标签,存储List集合对象propertyElements
    47. List<Element> propertyElements = beanElement.elements();
    48. //5.4 增强for遍历List集合对象propertyElements
    49. for (Element propertyElement : propertyElements) {
    50. //5.4.1 循环内部获取当前property标签的name和value的属性值,以及文本内容
    51. String name = propertyElement.attributeValue("name");
    52. String value = propertyElement.attributeValue("value");
    53. String text = propertyElement.getText();
    54. //5.4.2 循环内部输出5.4.1中获取的属性值及文本内容
    55. System.out.println("\t\t" + name + "-----" + value + "-----" + text);
    56. }
    57. }
    58. is.close();
    59. }
    60. }

     使用dom4j支持xpath解析

    1. /*
    2. 第三方工具(jar包)XPath:
    3. 作用: 快速查找xml文件中的一个/多个节点
    4. 注意: 必须依赖于dom4j
    5. 使用:
    6. 1.导入jar包
    7. 2.api的介绍
    8. SAXReader类
    9. 空参构造: public SAXReader(){} 可以直接创建对象
    10. public Document read(InputStream is): 加载xml文档到内存,生成一个Document对象
    11. public List<Node> selectNodes("xpath表达式"),用来获取多个节点
    12. public Node selectSingleNode("xpath表达式"),用来获取一个节点
    13. xpath表达式常用查询形式
    14. 1.//AAA//DDD//BBB: 表示一层一层的,AAA下面 DDD下面的BBB
    15. 2.//BBB: 表示和这个名称相同,表示只要名称是BBB 都得到 BBB指的是标签名
    16. 3./*: 所有元素
    17. 4.查看第一个/最后一个元素
    18. BBB[1]:表示第一个BBB元素
    19. BBB[last()]:表示最后一个BBB元素
    20. 5.//BBB[@id]: 表示只要BBB元素上面有id属性 都得到
    21. 6.//BBB[@id='b1'] 表示元素名称是BBB,在BBB上面有id属性,并且id的属性值是b1
    22. 练习:
    23. 1.查询所有student标签
    24. 2.查询所有student标签下的name标签
    25. 3.查询student标签下带有id属性的name标签
    26. 4.查询student标签下带有id属性的name标签 并且id属性值为itcast
    27. */
    28. public class Demo02XPathXml {
    29. public static void main(String[] args) throws Exception {
    30. //创建dom4j核心类的对象
    31. SAXReader saxReader = new SAXReader();
    32. //使用类加载器获取xml文件的对应的字节输入流对象
    33. InputStream is = Demo02XPathXml.class.getClassLoader().getResourceAsStream("students.xml");
    34. //加载xml文件获取对应的Document对象
    35. Document document = saxReader.read(is);
    36. //1.查询所有student标签
    37. List<Node> nodeList = document.selectNodes("//student");
    38. //遍历
    39. for (Node node : nodeList) {
    40. System.out.println(node);
    41. }
    42. System.out.println("--------------");
    43. //2.查询所有student标签下的name标签
    44. nodeList = document.selectNodes("//student//name");
    45. //遍历
    46. for (Node node : nodeList) {
    47. System.out.println(node);
    48. }
    49. System.out.println("--------------");
    50. //3.查询student标签下带有id属性的name标签
    51. Node node = document.selectSingleNode("//student//name[@id]");
    52. System.out.println(node);
    53. System.out.println("--------------");
    54. //4.查询student标签下带有id属性的name标签 并且id属性值为itcast
    55. node = document.selectSingleNode("//student//name[@id='itcast']");
    56. System.out.println(node);
    57. }
    58. }

  • 相关阅读:
    凉鞋的 Godot 笔记 102. 场景与节点的增删改查
    Linux系统100条命令:关于Ubuntu和 CentOS 7 相同功能的不同的终端操作命令
    一文理解Flink 水位线(Flink Watermark)
    Excel 多条件筛选 与 数据透视表 实现
    大数据Hadoop之——HDFS小文件问题与处理实战操作
    break,continue
    nnUNet 详细解读(一)论文技术要点归纳
    开源IPTV源服务程序使用教程
    机器学习基础:大数定律与中心极限定理
    改造 Kubernetes 自定义调度器
  • 原文地址:https://blog.csdn.net/czdzz/article/details/125456087