XML约束(3)

时间:2023-03-09 05:55:23
XML约束(3)

本节要点:

  • 了解XML的约束模式
  • 了解DTD
  • 了解Schema

了解XML的约束模式

计算机程序在处理XML文档之前,必须能够解析出XML文档的内容中各个元素的相关信息。将解析出来的信息再交给下游程序进行下一步处理。Parser就是用于解析XML文档的解析器程序,Parser可以独立使用,也可以成为编辑软件或浏览器的一部分。

所以XML文档必须严格遵循一定的语法,遵守XMl基本语法规则和规范的XML文档就称为Well-formed XML。一个XML文档必须是格式良好的,并且内容满足某些条件的约束。

约束模式是一套规则,对XML文档中的内容作出限制。约束模式定义了XML文档中允许出现的元素名,元素中的属性,内容类型,及元素间的嵌套关系和出现顺序。约束模式通常都在一个单独的文件中进行定义。约束模式的内容也需要遵循一定的语法规则,使用XML约束模式语言来定义XML约束模式的语法规则,模式文档采用某种约束模式语言编写如:XML DTD、XDR、SOX、XML Schema等,应用最广泛和具有代表意义的是XML DTD和XML Schema。

DTD

XML DTD(Document Type Definition 文档类型定义)

  • 最早出现的一种XML约束模式语言
  • 目前使用最广泛的一种XML约束模式
  • 以.dtd为扩展名
  • Struts使用较多

有效的XML必须遵循XML 的基本语法规则,且符合为它指定的某个XML约束模式的XML文档。校验是将一个XML文档和它所引用的XML约束模式进行比较分析,看其中的内容是否符合XML约束模式的过程。

2.1 DTD语法

l DTD(document type definition):文档类型定义

l 作用:约束XML的书写规范

1.一个简单例子

book.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE books SYSTEM "../dtd/books.dtd">
<books>
<book>
<author>张三</author>
<title>一本好书</title>
<price>20.00</price>
</book>
</books>

books.dtd

<!ELEMENT books (book+)>
<!ELEMENT book (author,title,price)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT price (#PCDATA)>

注:元素和子元素属性之间有空格分隔,如author  (#PCDATA)

1) 元素声明语法

语法格式:

<!ELEMENT 元素名称 使用规则>

使用规则:

定义元素中包含的组成部分,以及每种组成成分出现的次数、次序,还可以是某些成分进行某种关系组合后出现的次数、次序。

元素通配符使用

元字符

含义

+

出现一次或多次

*

出现零次或多次

可选,不出现或出现一次

(  )

一组要共同匹配的表达式

|

或(OR)

元素A, 元素B, 元素C

元素之间以逗号分割,要求严格遵从顺序要求

元素A  元素B  元素C

元素之间以空格分割,无须遵从顺序要求

示例:

(book+):表示books元素中可以包含一个或多个book元素

(title,author,price)

  • 表示book元素中要嵌套title、author、price子元素,并且这些子元素要按顺序依次出现,只能出现一次
  • 如果没有“,”隔开,表示各子元素可以任意次序出现,但必须且只能出现一次
  • 如果使用“|”隔开,表示只能出现它们之中的任何一个

(#PCDATA)

用于表示元素中的内容是普通文本字符串。

2) 属性声明语法

语法格式:

<!ATTLIST 标签名 属性列表 属性类型 出现方式>

“出现方式”设置

设置

描述

#REQUIRED

表示这个属性是必须的

#IMPLIED

表示这个属性的值是可选的

#FIXED

表示这个属性有一个固定的不能更改的值

默认

表示这个属性有一个默认值

“属性类型”设置

设置

描述

CDATA

文本类型

Enumerated

一个字符串值得枚举,表示可以任选其中一个

ID

表示唯一标示符(注:由ID表示的属性不能以数字开头)

ENTITY

一个外部实体(现在的浏览器不支持)

示例:

books.dtd

<!ELEMENT books (book+)>

<!ELEMENT book ((author,title,price)|comment+)>

<!ELEMENT author (#PCDATA)>

<!ELEMENT title (#PCDATA)>

<!ELEMENT price (#PCDATA)>

<!ATTLIST comment

author CDATA #IMPLIED

title CDATA #REQUIRED

price CDATA #IMPLIED

language CDATA #FIXED "Chinese"

type (java|.net|oracle) "java"

id ID #REQUIRED

>

Books.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE books SYSTEM "books.dtd">

<books>

<book>

<author>joy</author>

<title>java core</title>

<price>100</price>

</book>

<book>

<comment id="S001" author="joy" title="Java" price="20" language="Chinese" />

<comment id="S002" author="joy" title="Java" price="20" language="Chinese" />

</book>

</books>

2.2 引入外部DTD文件

使用文档类型声明DOCTYPE语句引入DTD。格式如下:

<!DOCTYPE 文档类型名称 SYSTEM “DTD文件的URL”>

<! DOCTYPE 文档类型名称 PUBLIC “DTD名称” “DTD文件的URL”>

注:

  • 文档类型名称由编写者自己定义,通常是使用XML文档的根元素名称作为文档类型名称
  • SYSTEM表示XML文档所遵循的是一个本地或者组织内部所编写和使用的DTD文件
  • PUBLIC表示XML文档遵循的是一个由权威机构制定的,公开提供给特定行业或公众使用的DTD文件
  • “DTD名称”需要使用双引号括起来,应该符合一些标准的规定
  • SYSTEM 后面的“DTD文件的URL”可以是相对URL,也可以是绝对URL;PUBLIC 后面的“DTD文件的URL” 指定DTD文件在Internet上的绝对URL
  • <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">中:

ü “-” 表示ISO标准的DTD,“+”被改进的非ISO标准的DTD,“-”未被改进的非ISO标准的DTD

ü “Apache Software Foundation”表示 DTD所有者的名称

ü “DTD Struts Configuration 2.3”表示DTD所描述的文件的说明

ü “EN“表示DTD语言的种类

2.3 嵌入DTD定义语句

可以在XML中嵌入使用DTD。

Schema

XML Schema

  • 对XML文档内容进行约束的另外一种模式
  • 目的是为了克服DTD的局限性,为XML提供丰富的语法结构
  • XML Schema已经成为W3C的正式推荐标准
  • 以.xsd为扩展名

XML Schema VS DTD:

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

schema的基础是数据类型,理解schema的最好方式是将它看成是数据类型的层次结构,在层次结构的底层是内置的不可再划分的数据类型,如:整数、字符串、浮点数、日期等,表示xml文件可能包含的数据的基本单元。通过组合这些简单的数据类型,可以创建出各种不同的复杂数据类型,然后可以使用这些数据类型来定义元素和属性。这样,你将为xml文档的根元素、子元素、一直到最底层的包含文档数据的元素定义数据类型,因此,学习创建xsd schema,大体上就成了一个定义数据类型的过程。