XML入门-2

一,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>

猜你喜欢

转载自blog.csdn.net/qq_36792120/article/details/111477302
今日推荐