思考:XML中都是自定义标签,如果在公司编写员工个人信息的时候使用XML文档编写,在编写过程中标签的英文打错了会导致在查找此名员工时出现错误,或者在员工档案中出现游戏名称这种荒谬的情况,那么如何避免这种问题?
使用XML中的语义约束
XML中的语义约束有两种方式:
1.DTD
DTD是一种简单易用的语义约束方式
DTD通常以单独的文件出现,其扩展名为.dtd
以下是一份简单的dtd文件
<!EMELENT class (student+)>
<!EMELENT student (name,no,gender)>
<!EMELENT name (#PCDATA)>
<!EMELENT gender (#PCDATA)>
<!ATTLIST student no CDATA "">
PCDATA是限制元素里面的内容是字符类型的,而这个CDATA是限制属性里面的内容是字符类型。
//用<!EMELENT 元素名 (子元素1,子元素2,....)>来定义元素
//用<!ATTLIST 元素名 属性名 属性类型 默认值>来定义属性
例:
<!EMELENT student (name,no,gender)> : student元素有name,no,gender这三个子元素
<!EMELENT name (#PCDATA)> :name元素为纯文本元素不能有子元素
利用DTD的<!EMELENT >标签,我们可以定义XML文档中允许出现的节点数量与个数:
定义hr节点下只允许出现1个employee子节点
<!EMELENT hr(employee)>
定义可以出现的标签时,必须按定义的顺序写
定义name标签体只能是文本,#PCDATA代表文本元素
<!EMELENT name (#PCDATA)>
DTD定义节点数量:
如某个子节点需要多次重复出现,则需要在子节点后面增加相应的描述符:
定义hr节点下至少出现1个employee子节点
<!EMELENT hr(employee+)>
定义hr节点下至少0个(可以出现也可以不出现)employee子节点
<!EMELENT hr(employee*)>
定义hr节点下至多出现1个employee子节点
<!EMELENT hr(employee?)>
在XML中引用DTD文件
<!DOCTYPE 根节点 SYSTEM “dtd文件路径”>
实例:
<!DOCTYPE hr SYSTEM “hr.dtd”>
2.XML Schema
xml schema比dtd更为复杂,提供更多功能
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema">
<element name="hr">
<!--complexType标签含义是复杂节点,包含子节点是必须使用这个标签-->
<complexType>
<!--有序的:sequence-->
<sequence>
<!-- minOccurs="1"指的是至少有一个employee maxOccurs为至多 -->
<element name="employee" minOccurs="1" maxOccurs="9999">
<complexType>
<sequence>
<element name="name" type="string"></element>
<element name="age" type="string">
<!-- 简单约束 -->
<simpleType>
<restriction base="integer">
<!-- 最小值-->
<minInclusive value="18"></minInclusive>
<maxInclusive value="60"></maxInclusive>
</restriction>
</simpleType>
</element>
<element name="salary" type="string"></element>
<element name="department" type="string">
<complexType>
<sequence>
<element name="dname" type="string"></element>
<element name="address" type="string"></element>
</sequence>
</complexType>
</element>
</sequence>
<!-- use="required" 为: no这个属性在任何employee节点下必须存在 -->
<attribute name="no" type="string" use="required"></attribute>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
在XML中引用Schema
在后文件中加属性:xmlns:xsi:http://www.w3.org/2001/XMLSchema-instance
xsi:noNameSpaceSchemaLocation=”xsd文件名.xsd”