欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

XML 文档的验证 DTD XSD

程序员文章站 2022-03-03 17:41:42
...

XML验证

有正确的XML被称为"形式良好"的XML

DTD约束

DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。

DTD可声明在XML文档中, 也可通过外部引入

内部的 DOCTYPE 声明

假如 DTD 被包含在您的 XML 源文件中,它应当通过下面的语法包装在一个 DOCTYPE 声明中:

<!DOCTYPE root-element [element-declarations]>

带有 DTD 的 XML 文档实例(请在 IE5 以及更高的版本打开,并选择查看源代码):

<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
	<to>Tove</to>
	<from>Jani</from>
	<heading>Reminder</heading>
	<body>"Don't forget me this weekend"</body>
</note>

解释如下

  1. !DOCTYPE note (第二行): 定义此文档是note类型的文档
  2. !ELEMENT note: 定义note元素有四个元素: "to, from, heading, body”
  3. !ELEMENT to: 定义to元素为"#PCDATA"类型
  4. !ELEMENT from: 定义from 元素为"#PCDATA"类型
  5. !ELEMENT heading素为"#PCDATA"类型
  6. !ELEMENT body: 定义from 元素为"#PCDATA"类型

外部文档声明

假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中:

<!DOCTYPE root-element SYSTEM "filename">

这个 XML 文档和上面的 XML 文档相同,但是拥有一个外部的 DTD:

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
	<to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Dot't forget me this weekend!</body>
</note>

这是包含DTD的note.dtd文件

<!ELEMENT note (to, from, heading, body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

PCDATA数据格式

PCDATA 的意思是被解析的字符数据( parsed character data).

可把字符数据想象为XML元素的开始标签与结束标签之间的文本 PCDATA 是会被解析器解析的文本, 这些文本将被解析器检查实体以及标记. 文本中的标签会被当做标记来处理, 而实体会被展开. 不过, 被解析的字符数据不应该包含任何&, < 或 >等字符. 需要用实体来表示.

CDATA数据格式

CDATA 的意思是字符数据(character data)。

**CDATA 是不会被解析器解析的文本。**在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。

元素格式

  1. 空元素 <!ELEMENT element-name EMPTY>
  2. 可以为任何内容 <!ELEMENT element-name ANY>
  3. 最少出现一次的元素 <!ELEMENT element-name (child-name+)>
  4. 出现零次或多次的元素 <!ELEMENT element-name (child-name*)>
  5. 出现零次或一次的元素<!ELEMENT element-name (child-name?)>
  6. 声明"非…/即…"类型的内容<!ELEMENT element-name (child-name1 | child-name2 | …)>
  7. 声明混合型的内容<!ELEMENT element-name (#PCDATA | to | from | heading)*>

属性约束格式

属性通过ATTLIST 声明来进行声明

DTD属性声明用如下格式

<!ATTLIST element-name attribute-name attribute-type attribute-value>
<!ATTLIST payment type CDATA "check">
<!--实例如下-->
<payment type="check"/>

属性类型:

类型 描述
CDATA 值为字符数据 (character data)
(en1|en2|…) 此值是枚举列表中的一个值
ID 值为唯一的 id
IDREF 值为另外一个元素的 id
IDREFS 值为其他 id 的列表
NMTOKEN 值为合法的 XML 名称
NMTOKENS 值为合法的 XML 名称的列表
ENTITY 值是一个实体
ENTITIES 值是一个实体列表
NOTATION 此值是符号的名称
xml: 值是一个预定义的 XML 值

默认属性值可以使用下列值

解释
属性的默认值
#REQUIRED 属性值是必需的
#IMPLIED 属性不是必需的
#FIXED value 属性值是固定的

列举属性值

<!ATTLIST element-name attribute-name (en1|en2|..) default-value>

XML Schema约束

简介

  • XML Schema是基于XML的DTD代替者
  • XML Schema是可描述XML文档的结构
  • XML Schem语言也可作为XSD(XML Schema Definition) 来引用

什么是XML Schema

XML Schema 的作用是定义XML文档的合法构建模块, 类似DTD

XML Schema:

  • 定义可出现在文档中的元素
  • 定义可出现在文档中的属性
  • 定义哪个元素是子元素
  • 定义子元素的顺序
  • 定义子元素的数目
  • 定义元素是否为空, 或者是否可包含文本
  • 定义元素和属性的数据类型
  • 定义元素和属性的默认值以及固定值

XML Schema 是 DTD的继任者

  • XML Schema可针对未来的需求进行扩展
  • XML Schema 更完善, 功能更强大
  • XML Schema 基于XML编写
  • XML Schema支持数据类型
  • XML Schema支持命名空间

XML Schema使用XML语法编写, 本身就是XML

  • 不必学习新的语言
  • 可使用XML编辑器来编写Schema文件
  • 可使用XML解析器来解析Schema文件
  • 可使用XML DOM来处理Schema文件
  • 可通过XSLT来转换Schema文件

如何使用

一个简单的XML文档

<?xml version="1.0"?>
<note>
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>

下面这个例子是一个名为"note.xsd”的XML Schema文件, 它定义了上面哪个note.xml文档的元素

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com"
elementFormDefault="qualified">

<xs:element name="note">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="to" type="xs:string"/>
            <xs:element name="from" type="xs:string"/>
            <xs:element name="heading" type="xs:string"/>
            <xs:element name="body" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

将此note.xml文档包含xml Schema的约束, 使用如下

<?xml version="1.0" encoding="utf-8"?>
<note xmlns="http://www.w3schools.com"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.w3schools.com note.xsd">
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
</note>

XSD-元素

schema元素是每一个xml Schema的根元素

<?xml version="1.0" encoding="utf-8"?>
<xs:schema>
...
...
</xs:schema>

元素一般都包含属性. 一个schema声明往往是这样的

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
	targetNamespace="http://www.runoob.com"
	xmlns="http://www.runoob.com"
	elementFormDefault="qualified">
>
...
...
</xs:schema>

解释如下:

  1. xmlns:xs=“http://www.w3.org/2001/XMLSchema

    此片段显示schema中用到的元素和数据类型来自命名空间"http://www.w3.org/2001/XMLSchema”中. 同时它还规定了来自命名空间"http://……." 的元素和数据类型应该使用前缀xs:, 相当于命名空间的别名

  2. targetNamespace="http://www.runoob.com

    此片段显示被此schema定义的元素(note to from heading body) 来自命名空间:"http:www.runoob.com”.

  3. elementFormDefault=“qualified”

    指出任何xml实例所使用的且在此schema中声明过的元素必须被命名空间限定

在XML文档中引用Schema文档是这样的

<?xml version="1.0" encoding="utf-8"?>
<note xmlns="http://www.runoob.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.runoob.com note.xsd">

<to>Tove</to>
<form>Jani</form>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

解释如下:

  1. xmlns=“http://www.runoob.com

    规定了默认命名空间的声明, 此声明会告知schema验证器, 在此XML文档中使用的所有元素都被声明于"http://www.runoob.com”这个命名空间

  2. xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”

    一旦声明了此命名空间, 就可以使用schemaLocation属性了, 此属性有两个值, 第一个值是需要的命名空间, 第二个值是供命名空间使用的xml schema的位置

XSD-简易属性

简易属性指那些只包含文本的元素. 它不会包含任何其他的元素或属性.

定义简易元素:

<xs:element name=“xxx” type=“yyy” />

xxx: 指元素的名称, yyy指元素的数据类型, XML Schema拥有很多内建的数据类型

  • xs:string
  • xs:decimal
  • xs:integer
  • xs:boolean
  • xs:date
  • xs:time

例如:

<lastname>Refsnes</lastname>
<age>36</age>
<databorn>1970-03-27</databorn>

xsd定义如下

<xs:element name="lastname" type="xs:string"/>
<xs:element name="age" type="xs:integer"/>
<xs:element name="dateborn" type="xs:date"/>

简易元素的默认值和固定值

缺省值定义

<xs:element name="color" type="xs:string" default="red"/>

固定值是不能被更改的

<xs:element name="color" type="xs:string" fixed="red"/>

xsd-对值的限定

限定(restriction) 用于为xml元素或者属性定义可接受的值, 对xml元素的限定被称为 facet

限定age元素, 0<age<120

<xs:element name="age">
	<xs:sipleType>
    	<xs:restriction base="xs=integer">
        	<xs:minInclusive value="0"/>
            <xs:maxInclusive value="120"/>
        </xs:restriction>
    </xs:sipleType>
</xs:element>

对一组值的限定

如果把XML元素的内容限制为一组可接受的值, 我们使用枚举约束.

下面例子定义了一个带有限定的名为"Car”的元素, 可接受的值只有"Audi Golf BWM”

<xs:element name="car">
	<xs:simplyType>
    	<xs:restriction base="xs:string">
        	<xs:enumeration value="Audi"/>
            <xs:enumeration value="Golf"/>
            <xs:enumeration value="BWM"/>
        </xs:restriction>
    </xs:simplyType>
</xs:element>

也可以写成这样

<xs:element name="car" type="carType"/>
<xs:simpleType name="carType">
	<xs:restriction base="xs:string">
    	<xs:enumeration value="Audi"/>
        <xs:enumeration value="Gold"/>
        <xs:enumeration value="BWM" />
    </xs:restriction>
</xs:simpleType>

这种写法中, 类型"carType"也可以被其他元素使用, 因为它不是car元素的组成部分

对一系列值得限定

我们可以使用模式约束对xml元素得内容进行一系列得限定

限定"letter"元素, 可接受得值只有小写字母a-z其中得一个

<xs:element name="letter">
	<xs:simpleType>
    	<xs:restriction base="xs:string">
        	<xs:pattern value="[a-z]"/>
        </xs:restriction>
    </xs:simpleType>
</xs:element>

pattern中可填放正则表达式

对空白字符得限定

下面例子, 定义了一个带有限定得名为"address”得元素. 这个whiteSpace 限定设置为"preserve", 这意味着XML处理器不会移除任何一个空白字符

<xs:element name="address">
	<xs:simpyType>
    	<xs:restriction base="xs:string">
        	<xs:whiteSpace value="preserve"/>
        </xs:restriction>
    </xs:simpyType>
</xs:element>

限定"address"元素移除所有空格:

<xs:element name="address">
	<xs:simpleType>
    	<xs:restriction  base="xs:string">
        	<xs:whiteSpace value="replace"/>
        </xs:restriction>
    </xs:simpleType>
</xs:element>

限定元素"address"将所有得空格只保留一个空格, 类似HTML

<xs:element name="address">
	<xs:simpleType>
    	<xs:restriction base="xs:string">
        	<xs:whiteSpace value="cellaase"/>
        </xs:restriction>
    </xs:simpleType>
</xs:element>

对长度得限定:

使用length, maxLength, minLength来限定一个元素中值得长度

限定名为"password"得元素, 长度必须精确到8位

<xs:element name="password">
	<xs:simpeType>
    	<xs:restriction base="xs:string">
        	<xs:length value="8"/>
        </xs:restriction>
    </xs:simpeType>
</xs:element>

数据类型得限定表格

限定 描述
enumeration 定义可接受值的一个列表
fractionDigits 定义所允许的最大的小数位数。必须大于等于0。
length 定义所允许的字符或者列表项目的精确数目。必须大于或等于0。
maxExclusive 定义数值的上限。所允许的值必须小于此值。
maxInclusive 定义数值的上限。所允许的值必须小于或等于此值。
maxLength 定义所允许的字符或者列表项目的最大数目。必须大于或等于0。
minExclusive 定义数值的下限。所允许的值必需大于此值。
minInclusive 定义数值的下限。所允许的值必需大于或等于此值。
minLength 定义所允许的字符或者列表项目的最小数目。必须大于或等于0。
pattern 定义可接受的字符的精确序列。
totalDigits 定义所允许的阿拉伯数字的精确位数。必须大于0。
whiteSpace 定义空白字符(换行、回车、空格以及制表符)的处理方式。

复合元素

复合元素指包含其他元素及/或属性得XML元素

四种类型得复合元素

  • 空元素
  • 包含其他元素得元素
  • 仅包含文本得元素
  • 包含元素和文本得元素

如何定义复合元素

<employee>
	<firstname>John</firstname>
    <lastname>Smith</lastname>
</employee>

现在我们用xsd来定义此元素

sequence 意味着此元素必须包含指定得顺序

<xs:element name="employee">
	<xs:complexTyep>
    	<xs:sequence>
        	<xs:element name="firstname" type="xs:string"/>
            <xs:element name="lastname" type="xs:string" />
        </xs:sequence>
    </xs:complexTyep>
</xs:element>

以上也可以这样写

<xs:element name="employee" type="personinfo"/>

<xs:complexType name="personinfo">
	<xs:sequence>
    	<xs:element name="firstname" type="xs:string"/>
        <xs:element name="lastname" type="xs:string"/>
    </xs:sequence>
</xs:complexType>