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技术的支持;
 
![](https://b2.hlcode.me/CSDN/xiaokulin/JavaWeb/ee24e884330f39c38acbda55d3a9eb60.webp)
 
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>