XML入门-2

作者: 好多可乐 | 来源:发表于2020-12-22 00:04 被阅读0次

    一,XML语义约束

    1,XML文档结构正确,但可能不是有效的

    比如:员工档案xml中决不允许出现“植物品种”标签。xml语义约束就是用于规定xml文档中允许出现哪些元素

    2,XML语义约束有2种定义方式:DTD与XML Schema。

    二,DTD

    1,定义:DTD(Document Type Definition,文档类型定义)是一种简单易用的语义约束方式。

    2,DTD文件的扩展名为.dtd

    3,利用DTD中的<!ELEMENT>标签,我们可以定义XML文档中允许出现的节点及数量,以hr.xml为例:

    • 定义hr节点下只允许出现1个employee子节点:
    <!ELEMENT hr(employee)>
    
    • employee节点下必须包含以下四个节点,且按顺序出现:
    <!ELEMENT employee(name,age,salary,department)>
    
    • 定义name标签体只能是文本,#PCDATA代表文本元素
    <!ELEMENT name (#PCDATA)>
    

    如果某个子节点需要多次重复出现,则需要在子节点后增加响应的描述符

    • hr节点下最少出现1个employee子节点
    <!ELEMENT hr(employee+)>
    
    • hr节点下可出现0..n个employee子节点
    <!ELEMENT hr(employee*)>
    
    • hr节点下最多出现1个employee子节点
    <!ELEMENT hr(employee?)>
    

    4,在XML中使用<!DOCTYPE>标签来引用DTD文件

    书写格式:

    <!DOCTYPE 根节点 SYSTEM "dtd文件路径">
    

    示例:

    <!DOCTYPE hr SYSTEM "hr.dtd">
    

    上个demo

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hr SYSTEM "hr.dtd">
    
    <hr>
        <employee no="3309">
            <name>kola</name>
            <age>13</age>
            <salary>2333</salary>
            <department>
                <dname>it</dname>
                <address>xx大厦</address>
            </department>
        </employee>
        <employee no="3319">
            <name>lily</name>
            <age>13</age>
            <salary>3211</salary>
            <department>
                <dname>it</dname>
                <address>xx大厦</address>
            </department>
        </employee>
    </hr>
    
    <?xml version="1.0" encoding="UTF-8"?>
            <!ELEMENT hr (employee+)>
            <!ELEMENT employee (name,age,salary,department)>
            <!ELEMENT name (#PCDATA)>
            <!ELEMENT age (#PCDATA)>
            <!ELEMENT salary (#PCDATA)>
            <!ELEMENT department (dname,address)>
            <!ELEMENT dname (#PCDATA)>
            <!ELEMENT address (#PCDATA)>
            <!ATTLIST employee no "CDATA" "">
    

    注意,在规定父标签中子标签的数量时,父标签和后面的括号一定要有“空格”。

    //定义属性时的约束格式

    <!ATTLIST 节点名称 属性名称 CDATA ""> //引号内为默认值

    三,schema约束

    1. XML Schema比DTD更为复杂,提供了更多功能。
    2. XML Schema 提供了数据类型、格式限定、数据范围等特性。
    3. XML Schema是W3C标准。
      因为比较复杂,直接上代码看注释吧~
    <?xml version="1.0" encoding="UTF-8"?>
    <!--<!DOCTYPE hr SYSTEM "hr.dtd">-->
    <!--告诉xml文档约束使用的是schema-->
    <hr xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="hr.xsd">
        <employee no="3309">
            <name>kola</name>
            <age>13</age>
            <salary>2333</salary>
            <department>
                <dname>it</dname>
                <address>xx大厦</address>
            </department>
        </employee>
        <employee no="3319">
            <name>lily</name>
            <age>13</age>
            <salary>3211</salary>
            <department>
                <dname>it</dname>
                <address>xx大厦</address>
            </department>
        </employee>
    </hr>
    
    
    <?xml version="1.0" encoding="utf-8" ?>
    <!--定义schema:idea工具这句话要删掉,否则会报错-->
    <!--<schema xmlns="http://www.w3.org/2001/XMLSchema">-->
        <!--声明根节点-->
    <schema>
        <element name="hr">
            <!--coplexType标签含义是复杂节点,包含子节点时必须使用这个标签-->
            <complexType>
                <!--sequence表示序列,含义是子节点必须按照前后顺序书写-->
                <sequence>
                    <!--约束子节点最多最少出现的次数-->
                    <element name="employee" minOccurs="1" maxOccurs="999">
                        <complexType>
                            <sequence>
                                <element name="name" type="string"></element>
                                <element name="age">
                                    <!--限制年龄-->
                                    <simpleType>
                                        <restriction base="integer">
                                            <maxExclusive value="60"></maxExclusive>
                                            <minExclusive value="18"></minExclusive>
                                        </restriction>
                                    </simpleType>
                                </element>
                                <element name="salary" type="integer"></element>
                                <element name="department">
                                    <complexType>
                                        <sequence>
                                            <element name="dname" type="string"></element>
                                            <element name="address" type="string"></element>
                                        </sequence>
                                    </complexType>
                                </element>
                            </sequence>
                        </complexType>
                    </element>
                </sequence>
                <!--属性设置:定义use表示属性在任何节点必须存在-->
                <attribute name="no" type="string" use="required"></attribute>
            </complexType>
        </element>
    </schema>
    

    相关文章

      网友评论

        本文标题:XML入门-2

        本文链接:https://www.haomeiwen.com/subject/nurjnktx.html