- XML 文档结构正确,但可能不是有效的
- 例如,员工档案XML中决不允许出现“植物品种”标签。XML 语义约束就是用于规定 XML 文档中允许出现哪些元素
XML 语义约束有两种定义方式
DTD(Document Type Definition,文档类型定义)是一种简单易用的语义约束方式
- DTD的文件扩展名为 .dtd
以下为dtd的一个示例
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT hr (employee+)>
<!ELEMENT employee (name,age,salary,department)>
<!--属性类型CDATA;“”:默认为空字符串-->
<!ATTLIST employee no CDATA "">
<!--(#PCDATA)纯文本节点-->
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT salary (#PCDATA)>
<!ELEMENT department (dname,address)>
<!ELEMENT dname (#PCDATA)>
<!ELEMENT address (#PCDATA)>
- DTD定义节点
- 利用DTD的<!ELEMENT>标签,我们可以定义XML文档中允许出现的节点及数量,以下为例子 ```java 定义hr节点下只允许出现1个employee子节点 <!ELEMENT hr (employee)>
employee节点下必须包含以下四个节点,且按顺序出现 <!ELEMENT employee (name,age,salary,department)>
定义name标签体只能是文本,#PCDATA代表文本元素 <!ELEMENT name (#PCDATA)>
- DTD定义节点数量
- 如某个子节点需要多次重复出现,则需要在子节点后增加相应的描述符
```java
hr节点下最少出现1个employee子节点
<!ELEMENT hr (employee+)>
hr节点下可出现0-n个employee子节点
<!ELEMENT hr (employee*)>
hr节点下最多出现1个employee子节点
<!ELEMENT hr (employee?)>
- XML 引用 DTD 文件
- 书写格式
- 示例
- <!DOCTYPE hr SYSTEM “hr.dtd”>
- 书写格式
以下代码块为XML引用DTD文件的一个示例
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hr SYSTEM "hr.dtd">
<!-- 人力资源管理系统 -->
<hr>
<employee no="3301">
<name>李铁柱</name>
<age>37</age>
<salary>3600</salary>
<department>
<dname>人事部</dname>
<address>XX大厦-B105</address>
</department>
</employee>
<employee no="3302">
<name>林海</name>
<age>50</age>
<salary>7000</salary>
<department>
<dname>财务部</dname>
<address>XX大厦-B106</address>
</department>
</employee>
</hr>
XML Schema
- XML Schema 比 DTD 更为复杂,提供了更多功能
- XML Schema 提供了数据类型、格式限定、数据范围等特性
- XML Schema 是W3C 标准
以下为XML Schema的一个示例
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="hr">
<!-- complexType标签含义是复杂节点,包含子节点时必须使用这个标签 -->
<xs:complexType>
<xs:sequence>
<xs:element name="employee" minOccurs="1" maxOccurs="9999">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"></xs:element>
<xs:element name="age">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="18"></xs:minInclusive>
<xs:maxInclusive value="60"></xs:maxInclusive>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="salary" type="xs:integer"></xs:element>
<xs:element name="department">
<xs:complexType>
<xs:sequence>
<xs:element name="dname" type="xs:string"></xs:element>
<xs:element name="address" type="xs:string"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="no" type="xs:string" use="required"></xs:attribute>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<!-- 人力资源管理系统 -->
<hr xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="hr.xsd">
<employee no="3309">
<name>张三</name>
<age>31</age>
<salary>4000</salary>
<department>
<dname>会计部</dname>
<address>XX大厦-B103</address>
</department>
</employee>
<employee no="3310">
<name>李四</name>
<age>23</age>
<salary>3000</salary>
<department>
<dname>工程部</dname>
<address>XX大厦-B104</address>
</department>
</employee>
</hr>
编程练习一
练习dtd文件的书写:
练习Schema文档的书写:
- 为之前存储教学计划的plan.xml文件定义语义约束,首先为xml文件的course节点添加id属性,然后练习Schema文件的定义和使用,要求:
- 创建xsd文件
- 设置course节点最多有100个
- 定义course-name和exam-form节点为string类型,class-hour节点为integer类型,并设置最小值为20,最大值为110
- 设置id属性值为string类型,并且属性是必须有的
- 在plan.xml文档中引入xsd文件
- 为之前存储教学计划的plan.xml文件定义语义约束,首先为xml文件的course节点添加id属性,然后练习Schema文件的定义和使用,要求: