一,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约束
- XML Schema比DTD更为复杂,提供了更多功能。
- XML Schema 提供了数据类型、格式限定、数据范围等特性。
- 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>
网友评论