XML语义约束
文章目录
- DTD约束
- 节点约束
- 数据类型约束
- 标签属性约束
- 引用DTD文件
- XML Schema
- 节点约束
- 数据类型约束
- 标签属性约束
- 范围约束
- XML Schema引用
- 示例
DTD约束
节点约束
创建DTD文件对XML文档的结构进行进行约束,防止未定义的节点出现在文档中。
<!ELEMENT hr (employee)>
<!ELEMENT employee (name, age, salary, department)>
<!ELEMENT department (dname, address)>
使用ELEMENT
标签进行节点的约束,第一个参数为节点名称,‘()’中的参数为子节点的名称且子节点需按顺序出现,注意要在父节点和子节点间要以空格隔开,否则无法生效。
限制节点的同时也会限制节点的个数,所以需要对DTD进行合理的节点数的约束。
<!-- hr下最小出现一个employee节点 -->
<!ELEMENT hr (employee+)>
<!-- hr下可以出现任意个节点数 -->
<!ELEMENT hr (employee*)>
<!-- hr下最多可以出现1个employee节点 -->
<!ELEMENT hr (employee?)>
数据类型约束
通过DTD标签对节点的数据类型进行约束,防止出现异常的数据类型。
<!ATTLIST name (#PCDATA)>
使用ATTLIST
标签对标签的内容进行属性限制PCDATA
为文本类型。
标签属性约束
<!ATTLIST employee no CDATA "">
第一个参数为标签名,第二个参数为标签需要添加的属性,第三个参数为属性的数据类型,第四个参数为属性的默认值。
引用DTD文件
在XML文件中引用
<!DOCTYPE 根节点名 SYSTEM "DTD文件路径">
XML Schema
节点约束
<element name="hr">
<complexType>
<sequence>
<element name="employee">
<complexType>
<sequence>
<element name="name"></element>
<element name="age"></element>
<element name="salary"></element>
<element name="department">
<complexType>
<sequence>
<element name="dname"></element>
<element name="address"></element>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
element
表示表示节点,属性name
表示节点名称。
complexType
标签表示复杂节点,当包含子节点时必须使用该标签。
sequence
标签表示子节点必须按顺序排列。
默认的节点个数约束为1个,可以通过设置element
标签中的minOccurs
,maxOccurs
属性灵活设置节点的个数:
<element name="employee" minOccurs="1" maxOccurs="9999"><!-- 设置employee节点可以出现1-9999次 -->
...
</element>
数据类型约束
在XML Schema中可以灵活的为节点添加数据类型限制。通过element
标签中的type
属性,可以限制节点的数据类型,例如:
<element name="name" type="string"></element>
<element name="age" type="integer"></element>
<element name="salary" type="integer"></element>
标签属性约束
通过为节点添加attribute
标签,可以为节点添加属性,例如:
<element name="employee">
<attribute name="no" type="string" use="required"></attribute>
</element>
name
:属性名称
type
:属性的数据类型
use
:是否为必须
范围约束
相较于DTD的约束方式,XML Schema还可以对数值范围进行约束,可以为节点添加simpleType
标签定义范围,例如:
<element name="age">
<simpleType>
<restriction base="integer"><!-- 将年龄范围限制在18-60岁之间 -->
<minInclusive value="18"></minInclusive>
<maxInclusive value="60"></maxInclusive>
</restriction>
</simpleType>
</element>
XML Schema引用
在XML的根节点中加入以下属性,便可将Schema加入引用。
<hr xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="hr.xsd">
...
</hr>
示例
<!-- hr.xml -->
<?xml version="1.0" encoding="utf-8" ?>
<hr xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="hr.xsd">
<employee no="3001">
<name>Tom</name>
<age>18</age>
<salary>4000</salary>
<department>
<dname>产品部</dname>
<address>物联网大厦B-803</address>
</department>
</employee>
<employee no="3002">
<name>Jack</name>
<age>30</age>
<salary>4000</salary>
<department>
<dname>产品部</dname>
<address>物联网大厦B-803</address>
</department>
</employee>
</hr>
<!-- hr.xsd -->
<?xml version="1.0" encoding="UTF-8" ?>
<schema xmlns="http://www.w3.org/2001/XMLSchema">
<element name="hr">
<complexType>
<sequence>
<element name="employee" maxOccurs="9999">
<complexType>
<sequence>
<element name="name" type="string"/>
<element name="age" type="integer"/>
<element name="salary" type="integer"/>
<element name="department">
<complexType>
<sequence>
<element name="dname" type="string"/>
<element name="address" type="string"/>
</sequence>
</complexType>
</element>
</sequence>
<attribute name="no" type="string" use="required"/>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
还没有评论,来说两句吧...