【XML】XML凭什么是格式严格的?

凭什么XML是格式严格的HTML,我就像写HTML一样语法松散地写,又能怎么样?

什么是约束

由于HTML的语法格式松散性,很容易发生各种各样的错误。于是,出现XML,要求开发者在编写时,严格按照语法格式来书写。

在这里插入图片描述
XML中有两种约束技术:

  • DTD约束:语法相对简单,功能也相对简单。
  • Schema约束:语法相对复杂,功能也相对强大。

DTD约束

Document Type Definition,全称为文档类型定义。w3c有此技术的教程!

导入

导入只能出现在第二行,即<?xml version=”1.0” encoding=”utf-8”?>之后。

内部导入:
就是把约束写在本个XML文件里面。只对当前XML有效。
在这里插入图片描述

外部导入
方式一:本地文件系统导入
<!DOCTYPE 根元素 SYSTEM "约束所在的本地位置">

方式二:公共的外部导入
<!DOCTYPE 根元素 PUBLIC "约束所在的网络位置">

DTD约束标签语法

语法格式:

<!ELEMENT 元素名称 类别>  或 <!ELEMENT 元素名称 (元素内容)>

类别:

  1. 空标签: EMPTY。表示元素一定是空元素。
  2. 普通字符串: (#PCDATA)。表示元素的内容一定是普通字符串(不能含有子标签)。
  3. 任何内容: ANY。表示元素的内容可以是任意内容(包括子标签)

在这里插入图片描述

快速理解约束标签写法

<!ELEMENT web-app (servlet*,servlet-mapping*,welcome-file-list?) >
<!-- 含义说明:
	web-app包括三个标签,且必须顺序出现
	servlet:子标签个数任意;
	servlet-mapping:子标签个数任意;
	welcome-file-list:子标签最左只出现一次;
-->

<!ELEMENT servlet (servlet-name,description?,(servlet-class|jsp-file)) >
<!-- 含义说明:
	servlet有三个子标签,且必须顺序出现
	servlet-name:必须由,且只能出现一次;
	description:可选一次
	servlet-class和jsp-file:二选一,且只能出现一次
-->

DTD约束属性

语法格式:

<!ATTLIST 元素名称 
属性名称 属性类型 默认值(即约束)
属性名称 属性类型 默认值(即约束)
>
  1. 默认值:
#REQUIRED 属性值是必需的 
#IMPLIED   属性不是必需的 
#FIXED value 属性不是必须的,但属性值是固定的
  1. 属性类型:控制属性值的
CDATA :表示普通字符串 
(en1|en2|..): 表示一定是任选其中的一个值
ID:表示在一个xml文档中该属性值必须唯一。值不能以数字开头

完整的DTD约束文件示例

文件名:web-app_2_3.dtd

<?xml version="1.0" encoding="UTF-8"?>
<!--
	传智播客DTD教学实例文档。
	模拟servlet2.3规范,如果开发人员需要在xml使用当前DTD约束,必须包括DOCTYPE。
	格式如下:
	<!DOCTYPE web-app SYSTEM "web-app_2_3.dtd">
-->
<!ELEMENT web-app (servlet*,servlet-mapping* , welcome-file-list?) >
<!ELEMENT servlet (servlet-name,description?,(servlet-class|jsp-file))>
<!ELEMENT servlet-mapping (servlet-name,url-pattern+) >

<!ELEMENT servlet-name (#PCDATA)>
<!ELEMENT servlet-class (#PCDATA)>
<!ELEMENT url-pattern (#PCDATA)>
<!ELEMENT description (#PCDATA)>
<!ELEMENT jsp-file (#PCDATA)>

<!ELEMENT welcome-file-list (welcome-file+)>
<!ELEMENT welcome-file (#PCDATA)>

<!ATTLIST web-app version CDATA #IMPLIED>

Schema约束

XML Schema 也是一种用于定义和描述 XML 文档结构与内容的模式语言,其出现是为了克服 DTD 的局限性

XML Schema比DTD的优势:

  1. XML Schema符合XML语法结构,DOM、SAX等XML API很容易解析出XML Schema文档中的内容。
  2. XML Schema对名称空间支持得非常好。
  3. XML Schema比XML DTD支持更多的数据类型,并支持用户自定义新的数据类型。
  4. XML Schema定义约束的能力非常强大,可以对XML实例文档作出细致的语义限制。
  5. XML Schema不能像DTD一样定义实体,比DTD更复杂,但Xml Schema现在已是w3c组织的标准,它正逐步取代DTD

Schema特性:

  1. XML Schema 文件自身就是一个XML文件,但它的扩展名通常为.xsd

  2. 一个XML Schema文档通常称之为模式文档(约束文档),遵循这个文档书写的xml文件称之为实例文档。

  3. 和XML文件一样,一个XML Schema文档也必须有一个根结点,但这个根结点的名称为Schema

  4. 编写了一个XML Schema约束文档后,通常需要把这个文件中声明的元素绑定到一个URI地址上,在XML Schema技术中有一个专业术语来描述这个过程,即把XML Schema文档声明的元素绑定到一个名称空间上,以后XML文件就可以通过这个URI(即名称空间)来告诉解析引擎,xml文档中编写的元素来自哪里,被谁约束。

名称空间

理解命名空间:

  • 如果一个XML文档中使用了多个Schema文件,而这些Schema文件中定义了相同名称的元素,要使用时就会出现冲突;
  • 就像是一个Java文件中使用了import java.util.*和import java.sql.*时,在使用Date类时,就不确定Date是哪个包下的了;
  • 于是,名称空间就诞生了;
  • 用来处理元素和属性的名称冲突问题,与Java中的包是同一用途;

相关特性:

  1. 作用:告诉xml文档的哪个元素被哪个schema文档约束。 在一个xml文档中,不同的标签可以受到不同的schema文档的约束。
  2. 一个名称空间受到schema文档约束的情况
  3. 多个名称空间受到多个schema文档约束的情况
  4. 默认名称空间的情况
  5. 没有名称空间的情况

完整的Schema约束文件示例

文件名:web-app_2_5.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns="http://www.w3.org/2001/XMLSchema" 
	targetNamespace="http://www.example.org/web-app_2_5"
	xmlns:xsd="http://www.w3.org/2001/XMLSchema"
	xmlns:tns="http://www.example.org/web-app_2_5" 
	elementFormDefault="qualified">
	
	<xsd:element name="web-app">
		<xsd:complexType>
			<xsd:choice minOccurs="0" maxOccurs="unbounded">
				<xsd:element name="servlet">
					<xsd:complexType>
						<xsd:sequence>
							<xsd:element name="servlet-name"></xsd:element>
							<xsd:element name="servlet-class"></xsd:element>
						</xsd:sequence>
					</xsd:complexType>
				</xsd:element>
				<xsd:element name="servlet-mapping">
					<xsd:complexType>
						<xsd:sequence>
							<xsd:element name="servlet-name"></xsd:element>
							<xsd:element name="url-pattern" maxOccurs="unbounded"></xsd:element>
						</xsd:sequence>
					</xsd:complexType>
				</xsd:element>
				<xsd:element name="welcome-file-list">
					<xsd:complexType>
						<xsd:sequence>
							<xsd:element name="welcome-file" maxOccurs="unbounded"></xsd:element>
						</xsd:sequence>
					</xsd:complexType>
				</xsd:element>
			</xsd:choice>
			<xsd:attribute name="version" type="double" use="optional"></xsd:attribute>
		</xsd:complexType>
	</xsd:element>
</xsd:schema>

模拟servlet2.5规范,如果开发人员需要在xml使用当前Schema约束,必须包括指定命名空间。
格式如下:

<web-app xmlns="http://www.example.org/web-app_2_5" 
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xsi:schemaLocation="http://www.example.org/web-app_2_5 web-app_2_5.xsd"
		version="2.5">
	这里写具体的XML。。。
</web-app>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章