zoukankan      html  css  js  c++  java
  • XML、java解释XML、XML约束

    1.XML有什么用?

    (1)可以用来保存数据

    (2)可以用来做配置文件

    (3)数据传输载体

     

    2.XML格式

    XML 元素必须遵循以下命名规则:

    名称可以含字母、数字以及其他的字符
    名称不能以数字或者标点符号开始
    名称不能以字符 “xml”(或者 XML、Xml)开始
    名称不能包含空格

    元素分为简单元素与复杂元素:

    简单元素:元素里面包含了普通的文字

    复杂元素:元素里面还可以嵌套其他的元素

    示例:

    <?xml version="1.0" encoding="utf-8"?>
    <stus>
        <stu id="100">
            <name>张三</name>
            <age>13</age>
        </stu>
        <stu id="101">
            <name>李四</name>
            <age>14</age>
        </stu>
    </stus>

    3.CDATA区

    如果某段字符串里面有过多的字符, 并且里面包含了类似标签或者关键字的这种文字,不想让xml的解析器去解析。 那么可以使用CDATA来包装。

     CDATA区段开始于"<![CDATA[",结束于"]]>"。

    示例:

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <stus>
     3     <stu id="100">
     4         <name>张三</name>
     5         <age>13</age>
     6         <search><![CDATA[<a href="http://www.baidu.com">百度</a>]]></search>
     7     </stu>
     8     <stu id="101">
     9         <name>李四</name>
    10         <age>14</age>
    11     </stu>
    12 </stus>

    4.JAVA解析XML

    解析,就是把xml里面的文本数据提取出来。

    XML解析有很多种方式,比较常用的有两种,分别是DOM和SAX。

    两者的区别如下:

    针对上面两种解析,有一些公司给出了JAVA的解决方案,例如jaxp,jdom,dom4j。用的比较多的是dom4j。

    先要下载jar包进行导入,附上官网地址:https://dom4j.github.io/

    这里用的是dom4j-1.6.1.jar。

    5.DOM4j的基本使用

    public static void main(String[] args) throws DocumentException {
            // 创建sax读取对象
            SAXReader reader = new SAXReader();
            // 指定解析的xml源
            Document document = reader.read(new File("src/com/pr/xml/students.xml"));
            // 得到根元素
            Element rootElement = document.getRootElement();
            // 获取元素的名字getName()
            System.out.println(rootElement.getName());
            // 获取根元素下的stu元素
            System.out.println(rootElement.element("stu").getName());
            // 获取stu元素下的name元素
            System.out.println(rootElement.element("stu").element("name").getName());
            // 获取name元素的文本getText()
            System.out.println(rootElement.element("stu").element("name").getText());
        }

    这样子只能获取一个学生的全部信息,如果需要遍历全部:

    public static void main(String[] args) throws DocumentException {
            // 创建sax读取对象
            SAXReader reader = new SAXReader();
            // 指定解析的xml源
            Document document = reader.read(new File("src/com/pr/xml/students.xml"));
            // 得到根元素
            Element rootElement = document.getRootElement();
    
            // 得到根元素下一层级的所有元素,也就是两个stu
            List<Element> list = rootElement.elements();
            for (Element element:list) {
                String name = element.element("name").getText();
                String age = element.element("age").getText();
                System.out.println(name + ":" + age);
            }
        }

    6.DOM4j的XPath使用

    (1)首先添加jar包依赖:https://mvnrepository.com/artifact/jaxen/jaxen

    这里用的是:jaxen-1.1.1.jar

    (2)知道XPath怎么用,具体可以看看W3C

    示例代码:

    public static void main(String[] args) throws DocumentException {
            // 创建sax读取对象
            SAXReader reader = new SAXReader();
            // 指定解析的xml源
            Document document = reader.read(new File("src/com/pr/xml/students.xml"));
            // 得到根元素
            Element rootElement = document.getRootElement();
    
            // selectSingleNode获取的是第一个,只返回一个
            Element nameElement = (Element) rootElement.selectSingleNode("//name");
            System.out.println(nameElement.getText());
    
            // 获取xml里面的所有name元素
            List<Element> list = rootElement.selectNodes("//name");
            for (Element element:list) {
                System.out.println(element.getText());
            }
    
        }

    7.XML约束

    如下的文档, 属性的ID值是一样的。 这在生活中是不可能出现的。 并且第二个学生的姓名有好几个。 一般也很少。那么怎么规定ID的值唯一, 或者是元素只能出现一次,不能出现多次? 甚至是规定里面只能出现具体的元素名字。

        <stus>
            <stu id="10086">
                <name>张三</name>
                <age>18</age>
                <address>深圳</address>
            </stu>
            <stu id="10086">
                <name>李四</name>
                <name>李五</name>
                <name>李六</name>
                <age>28</age>
                <address>北京</address>
            </stu>
        </stus>

    XML的约束有两种方式:DTD(.dtd)与Schema(.xsd)

    DTD:语法自成一派, 早起就出现的。 可读性比较差。

    Schema:其实就是一个xml , 使用xml的语法规则, xml解析器解析起来比较方便 , 是为了替代DTD 。
    但是Schema 约束文本内容比DTD的内容还要多。 所以目前也没有真正意义上的替代DTD

    • DTD

    (1)DTD的基本格式

    示例:

        <!ELEMENT stus (stu)>  : stus 下面有一个元素 stu  , 但是只有一个
        <!ELEMENT stu (name , age)>  stu下面有两个元素 name  ,age  顺序必须name-age
        <!ELEMENT name (#PCDATA)> 
        <!ELEMENT age (#PCDATA)>
        <!ATTLIST stu id CDATA #IMPLIED> stu有一个属性 文本类型, 该属性可有可无

    (2)DTD的引入

    1. 引入网络上的DTD
    
       <!-- 引入dtd 来约束这个xml -->
    
              <!--    文档类型  根标签名字 网络上的dtd   dtd的名称   dtd的路径
    
              <!DOCTYPE stus PUBLIC "//UNKNOWN/" "unknown.dtd"> -->
    
    2. 引入本地的DTD
    
          <!-- 引入本地的DTD  : 根标签名字 引入本地的DTD  dtd的位置 -->
          <!-- <!DOCTYPE stus SYSTEM "stus.dtd"> -->
    
    3. 直接在XML里面嵌入DTD的约束规则
    
       <!-- xml文档里面直接嵌入DTD的约束法则 -->
    
              <!DOCTYPE stus [
                  <!ELEMENT stus (stu)>
                  <!ELEMENT stu (name,age)>
                  <!ELEMENT name (#PCDATA)>
                  <!ELEMENT age (#PCDATA)>
              ]>
    
              <stus>
                  <stu>
                      <name>张三</name>
                      <age>18</age>
                  </stu>
              </stus>
    • Schema

    (1)Schema的基本格式

    示例:

        <!-- xmlns  :  xml namespace : 名称空间 /  命名空间
        targetNamespace :  目标名称空间 。 下面定义的那些元素都与这个名称空间绑定上。 
        elementFormDefault : 元素的格式化情况。  -->
        <schema xmlns="http://www.w3.org/2001/XMLSchema" 
            targetNamespace="http://www.w3.org/teacher" 
            elementFormDefault="qualified">
            
            <element name="teachers">
                <complexType>
                    <sequence maxOccurs="unbounded">
                        <!-- 这是一个复杂元素 -->
                        <element name="teacher">
                            <complexType>
                                <sequence>
                                    <!-- 以下两个是简单元素 -->
                                    <element name="name" type="string"></element>
                                    <element name="age" type="int"></element>
                                </sequence>
                            </complexType>
                        </element>
                    </sequence>
                </complexType>
            </element>
        </schema>
    
    实例文档:
        <?xml version="1.0" encoding="UTF-8"?>
        <!-- xmlns:xsi : 这里必须是这样的写法,也就是这个值已经固定了。
        xmlns : 这里是名称空间,也固定了,写的是schema里面的顶部目标名称空间
        xsi:schemaLocation : 有两段: 前半段是名称空间,也是目标空间的值 , 后面是约束文档的路径。
         -->
        <teachers
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns="http://www.w3.org/teacher"
            xsi:schemaLocation="http://www.itheima.com/teacher teacher.xsd"
        >
            <teacher>
                <name>zhangsan</name>
                <age>19</age>
            </teacher>
            <teacher>
                <name>lisi</name>
                <age>29</age>
            </teacher>
            <teacher>
                <name>lisi</name>
                <age>29</age>
            </teacher>
        </teachers>

    (2)名称空间的作用

    一个xml如果想指定它的约束规则, 假设使用的是DTD ,那么这个xml只能指定一个DTD , 不能指定多个DTD 。 但是如果一个xml的约束是定义在schema里面,并且是多个schema,那么是可以的。简单的说: 一个xml 可以引用多个schema约束。 但是只能引用一个DTD约束。

    名称空间的作用就是在 写元素的时候,可以指定该元素使用的是哪一套约束规则。 默认情况下 ,如果只有一套规则,那么都可以这么写

    <teachers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:aa="http://www.w3.org/teacher"
    xmlns:bb="http://www.w3.org/teacher"
    xsi:schemaLocation="http://www.itheima.com/teacher teacher.xsd" >

    <
    name>张三</name> <aa:name></aa:name> <bb:name></bb:name>
  • 相关阅读:
    LeetCode 189. Rotate Array
    LeetCode 965. Univalued Binary Tree
    LeetCode 111. Minimum Depth of Binary Tree
    LeetCode 104. Maximum Depth of Binary Tree
    Windows下MySQL的安装与配置
    LeetCode 58. Length of Last Word
    LeetCode 41. First Missing Positive
    LeetCode 283. Move Zeroes
    《蚂蚁金服11.11:支付宝和蚂蚁花呗的技术架构及实践》读后感
    删除docker下的镜像
  • 原文地址:https://www.cnblogs.com/chichung/p/10305454.html
Copyright © 2011-2022 走看看