up:: XML概念与用途
XML语义约束:即XML文件不能瞎写,不能随便想写什么标签就写什么标签,也不能想写几个子标签就写几个子标签,标签的值不能想写啥就写啥?一个有具体的实际用途的XML,势必要满足一定的条件(逻辑条件,当前业务需求条件等),而如果仅仅靠人的注意和认真来满足这些条件,显然是不行的,必须要加一些强制的、明文规定的约束,这些约束也是正确编写出满足本业务的XML的强力工具。
XML语义约束实现有两种方式:DTD,XML Schema;本文的 核心是XML Schema ;
一,DTD简介
1.DTD使用方法:
注: 下面节点和()之间需要有空格!!!!!
注: 下面hr和(employee)之间需要有空格!!!!!
2.DTD文件写好后,怎么和XML文件关联在一起?
SYSTEM:代表本地加载dtd文件;
二:DTD示例
Eclipse中新建DTD文件:src→new→other…→XML下有个DTD File:DTD文件的名字,建议和对应的XML文件同名。
示例1:节点数量不对
示例2: 子标签不匹配,dtd中定义的是ag,而xml中写的是age
示例三:子标签顺序不对
示例四:标签属性的设置
解决办法:
上述过程完整示例代码:(这些代码相对简单,可以选择性地看)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hr SYSTEM "hr.dtd">
<!-- 人力资源管理系统-->
<hr>
<employee no="3306"> <!-- 标签和属性尽量起的有意义,做到见名知意-->
<name>张三</name>
<age>31</age>
<salary>4000</salary>
<department> <!-- 标签可以嵌套-->
<dName>会计</dName>
<dAddress>4楼103室</dAddress>
</department>
</employee>
<employee>
<name>李四</name>
<age>29</age>
<salary>5000</salary>
<department>
<dName>工程部门</dName>
<dAddress>4楼105室</dAddress>
</department>
</employee>
</hr>
DTD文件
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT hr (employee+)> <!--实测发现,必须要加个空格,否则dtd不起作用-->
<!ELEMENT employee (name,age,salary,department)>
<!ATTLIST employee no CDATA "">
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT salary (#PCDATA)>
<!ELEMENT department (dName,dAddress)>
<!ELEMENT dName (#PCDATA)>
<!ELEMENT dAddress (#PCDATA)>
* * *
## 三:XML Schema简介
早期XML约束多使用DTD,但目前功能强大的XML Schema更常用;框架就需要XML Schema技术的支持;

XML Schema文件扩展名xsd;在Eclipse中创建方式,new→other→XML Schema File;
### 示例程序: **hr-schema.xsd:schema示例约束,十分重要!!!本篇博客最核心的地方!!!!!!!!!!!!!!!!!!!!**
<?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="9999":employee节点最多出现9999次-->
<element name="employee" minOccurs="1" maxOccurs="9999">
<complexType>
<sequence>
<element name="name" type="string"></element> <!-- type="string":name节点的值只能是字符串; -->
<element name="age">
<simpleType><!-- 如年龄,要求在18-60之间; <simpleType>标签可以设置数值范围-->
<restriction base="integer"><!-- 这儿的base="integer"表示我们要限定范围的数据是整数-->
<minInclusive value="18"></minInclusive>
<maxInclusive value="60"></maxInclusive>
</restriction>
</simpleType>
</element> <!-- Schema高级的地方就是有了数据类型 -->
<element name="salary" type="integer"></element>
<element name="department">
<complexType>
<sequence>
<element name="dName" type="string"></element>
<element name="dAddress" type="string"></element>
</sequence>
</complexType>
</element>
</sequence>
<!--在employee标签中有一个no属性,那么就在employee标签的那个 </complexType>标签位置上面设置attribute标签-->
<!-- “required”代表必须的,即任何employee标签如果不写no属性,会报错 -->
<attribute name="no" type="string" use="required"></attribute>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
hr-schema.xml: 注意在xml中引入xsd的方式;
<?xml version="1.0" encoding="UTF-8"?>
<!-- 人力资源管理系统-->
<!--xmlns:xsi的意思是告诉XML文档,我们的约束是使用Schema;xsi:noNamespaceSchemaLocation:指向xsd文件-->
<hr xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="hr-schema.xsd" >
<employee no="3306"> <!-- 标签和属性尽量起的有意义,做到见名知意-->
<name>张三</name>
<age>31</age>
<salary>4000</salary>
<department> <!-- 标签可以嵌套-->
<dName>会计</dName>
<dAddress>4楼103室</dAddress>
</department>
</employee>
<employee no="3377">
<name>李四</name>
<age>29</age>
<salary>5000</salary>
<department>
<dName>工程部门</dName>
<dAddress>4楼105室</dAddress>
</department>
</employee>
</hr>