• XML 文档结构正确,但可能不是有效的
    • 例如,员工档案XML中决不允许出现“植物品种”标签。XML 语义约束就是用于规定 XML 文档中允许出现哪些元素
  • XML 语义约束有两种定义方式

    • DTD
    • XML Schema

      DTD

  • DTD(Document Type Definition,文档类型定义)是一种简单易用的语义约束方式

  • DTD的文件扩展名为 .dtd

以下为dtd的一个示例

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!ELEMENT hr (employee+)>
  3. <!ELEMENT employee (name,age,salary,department)>
  4. <!--属性类型CDATA;“”:默认为空字符串-->
  5. <!ATTLIST employee no CDATA "">
  6. <!--(#PCDATA)纯文本节点-->
  7. <!ELEMENT name (#PCDATA)>
  8. <!ELEMENT age (#PCDATA)>
  9. <!ELEMENT salary (#PCDATA)>
  10. <!ELEMENT department (dname,address)>
  11. <!ELEMENT dname (#PCDATA)>
  12. <!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)>

  1. - DTD定义节点数量
  2. - 如某个子节点需要多次重复出现,则需要在子节点后增加相应的描述符
  3. ```java
  4. hr节点下最少出现1个employee子节点
  5. <!ELEMENT hr (employee+)>
  6. hr节点下可出现0-n个employee子节点
  7. <!ELEMENT hr (employee*)>
  8. hr节点下最多出现1个employee子节点
  9. <!ELEMENT hr (employee?)>
  • XML 引用 DTD 文件
    • 书写格式
    • 示例
      • <!DOCTYPE hr SYSTEM “hr.dtd”>

以下代码块为XML引用DTD文件的一个示例

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hr SYSTEM "hr.dtd">
  3. <!-- 人力资源管理系统 -->
  4. <hr>
  5. <employee no="3301">
  6. <name>李铁柱</name>
  7. <age>37</age>
  8. <salary>3600</salary>
  9. <department>
  10. <dname>人事部</dname>
  11. <address>XX大厦-B105</address>
  12. </department>
  13. </employee>
  14. <employee no="3302">
  15. <name>林海</name>
  16. <age>50</age>
  17. <salary>7000</salary>
  18. <department>
  19. <dname>财务部</dname>
  20. <address>XX大厦-B106</address>
  21. </department>
  22. </employee>
  23. </hr>

XML Schema

  • XML Schema 比 DTD 更为复杂,提供了更多功能
  • XML Schema 提供了数据类型、格式限定、数据范围等特性
  • XML Schema 是W3C 标准

以下为XML Schema的一个示例

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  3. <xs:element name="hr">
  4. <!-- complexType标签含义是复杂节点,包含子节点时必须使用这个标签 -->
  5. <xs:complexType>
  6. <xs:sequence>
  7. <xs:element name="employee" minOccurs="1" maxOccurs="9999">
  8. <xs:complexType>
  9. <xs:sequence>
  10. <xs:element name="name" type="xs:string"></xs:element>
  11. <xs:element name="age">
  12. <xs:simpleType>
  13. <xs:restriction base="xs:integer">
  14. <xs:minInclusive value="18"></xs:minInclusive>
  15. <xs:maxInclusive value="60"></xs:maxInclusive>
  16. </xs:restriction>
  17. </xs:simpleType>
  18. </xs:element>
  19. <xs:element name="salary" type="xs:integer"></xs:element>
  20. <xs:element name="department">
  21. <xs:complexType>
  22. <xs:sequence>
  23. <xs:element name="dname" type="xs:string"></xs:element>
  24. <xs:element name="address" type="xs:string"></xs:element>
  25. </xs:sequence>
  26. </xs:complexType>
  27. </xs:element>
  28. </xs:sequence>
  29. <xs:attribute name="no" type="xs:string" use="required"></xs:attribute>
  30. </xs:complexType>
  31. </xs:element>
  32. </xs:sequence>
  33. </xs:complexType>
  34. </xs:element>
  35. </xs:schema>
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- 人力资源管理系统 -->
  3. <hr xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="hr.xsd">
  4. <employee no="3309">
  5. <name>张三</name>
  6. <age>31</age>
  7. <salary>4000</salary>
  8. <department>
  9. <dname>会计部</dname>
  10. <address>XX大厦-B103</address>
  11. </department>
  12. </employee>
  13. <employee no="3310">
  14. <name>李四</name>
  15. <age>23</age>
  16. <salary>3000</salary>
  17. <department>
  18. <dname>工程部</dname>
  19. <address>XX大厦-B104</address>
  20. </department>
  21. </employee>
  22. </hr>

编程练习一

  • 练习dtd文件的书写:

    • 为之前存储教学计划的plan.xml文件定义语义约束,练习dtd文件的定义和使用,要求:
      1. 创建dtd文件
      2. 在根节点teaching-plan下只能出现course节点,course节点可以有多个
      3. 在course节点下只能出现course-name,class-hour和exam-form三个节点,并设置这三个节点为纯文本节点
      4. 在plan.xml文档中引入dtd文件

        编程练习二

  • 练习Schema文档的书写:

    • 为之前存储教学计划的plan.xml文件定义语义约束,首先为xml文件的course节点添加id属性,然后练习Schema文件的定义和使用,要求:
      1. 创建xsd文件
      2. 设置course节点最多有100个
      3. 定义course-name和exam-form节点为string类型,class-hour节点为integer类型,并设置最小值为20,最大值为110
      4. 设置id属性值为string类型,并且属性是必须有的
      5. 在plan.xml文档中引入xsd文件