文章目录
Chapter 23: XML
概述(Introduction)
XML:Extensible Markup Language(可扩展标记语言)
注意:标签没有被预定义,需要自行定义标签
例:购物清单
<purchae_order>
<identifier>P-101</identifier>
<purchaser>...</purchaser>
<itemlist>
<item>
<identifier>RS1</identifier>
<description>Atom powered rocked sled</description>
<quantity>2</quantity>
<price>199.95</price>
</item>
<item>
<identifier>SG1</identifier>
<description>Superb glue</description>
<quantity>1</quantity>
<unit-of-measure>Liter</unit-of-measure>
<price>199.95</price>
</item>
</itemlist>
</purchae_order>
XML 数据结构(Structure of XML Data)
标签:尖括号围住,成对出现或者自封闭
元素:一个元素是一对互相匹配的开始和结束标签,以及它们之间出现的所有文本
① 文本可以与子元素混合
例:对文本标记有益,但不利于数据展示
<course>
This course is being offered for the first time in 2009.
<course_id>BIO-399</course_id>
<title>Computational Biology</title>
<dept_name>Biology</dept_name>
<credits>3</credits>
</course>
② 属性:模式为 name = value,属性是字符串,不包含标记
<course course_id=”CS-101“>
<title>Intro. to Computer Science</title>
<dept_name>Comp Sci.</dept_name>
<credits>4</credits>
</course>
属性可以和子元素相互转化,建议元素的标识(ID)用属性表示,元素的内容用子元素表示:
<course course_id="CS-101">...</course>
<course>
<course_id>CS-101</course_id>
</course>
③ 名字空间(Namespace):每个标签或属性前加上通用资源标识符(或网址)
通过使用名字空间,避免在整个文档中使用长而唯一的名称
<university xmlns:yale="http://www.yale.edu">
<yale:course>
<yale:course_id>CS-101</yale:course_id>
<yale:title>Into. to Computer Science</yale:title>
<yale:dept_name>Comp. Sci.</yale:dept_name>
<yale:credits>4</yale:credits>
</yale:course>
</university>
④ 没有子元素的标签可以自封闭
<course course_id="CS-101" Title="Intro. To Computer Science" dept_name="Comp. Sci." credits="4" />
⑤ CDATA (character data)可用于表示带标签的字符串,这样字符串就不会被解析为子元素,而是解析为文本数据
注意:内部不再需要引号
<![CDATA[<course>...</course>]]>
XML 文档模式(XML Document Schema)
DTD
DTD:Document Type Definition(文档类型定义)
DTD 定义了 XML 文档的三个方面:
- 可以有哪些元素
- 元素可以有哪些属性、必须有哪些属性
- 元素的子元素可以有哪些、可以出现多少次
注意:DTD 不限制 XML 的数据格式,因为所有 XML 中的值都是以字符串的形式存在的
语法:
<!ELEMENT element(subelements-specification)>
<!ATTLIST element(attributes)>
① 子元素的限定:
- 子元素的名字
- #PCDATA(parsed character data),即子元素可以是字符串
- EMPTY(没有任何子元素)或 ANY(子元素可以是任何东西)
- 可以使用正则表达式:| 或 + 一个或多个 * 0 个或多个 ? 0 个或 1 个
<!DOCTYPE university[
<!ELEMENT university((department|course|instructor|teaches)+)>
<!ELEMENT department(dept_name, building, budget)>
<!ELEMENT course(course_id, title, dept_name, credites)>
<!ELEMENT instructor(IID, name, dept_name, salary)>
<!ELEMENT teaches(IID, course_id)>
<!ELEMENT dept_name(#PCDATA)>
<!ELEMENT building(#PCDATA)>
<!ELEMENT budget(#PCDATA)>
<!ELEMENT course_id(#PCDATA)>
<!ELEMENT title(#PCDATA)>
<!ELEMENT credits(#PCDATA)>
<!ELEMENT IID(#PCDATA)>
<!ELEMENT name(#PCDATA)>
<!ELEMENT salary(#PCDATA)>
]>
② 属性的限定:每个属性需要包括这几个限定
-
属性名
-
属性的类型
- CDATA(包含字符数据)
- ID(identifier,该元素的唯一标识符,跟 html 里的 id 一个意思)或 IDREF(ID reference,对另一个元素的引用,这个属性必须是在文档中的某个元素的 ID 属性,有点外键的意思)或IDREFS(multiple IDREFs,空格分开的引用列表)
-
其他限定
- #REQUIRED(每个元素在该属性上必须指定一个值)
- value(默认值)
- #IMPLIED(既不必须,也没有默认值)
<!DOCTYPE university [
<!ELEMENT university((department|course|instructor)+)>
<!ELEMENT department(building, budget)>
<!ATTLIST department
dept_name ID #REQUIRED>
<!ELEMENT course(title, credits)>
<!ATTLIST course
course_id ID #REQUIRED
dept_name IDREF #REQUIRED
instructors IDREFS #IMPLIED >
<!ELEMENT instructor(name, salary)>
<!ATTLIST instructor
IID ID #REQUIRED
dept_name IDREF #REQUIRED>
... other declarations ...
]>
③ DTD 的限制
- 单个文本元素和属性不能进一步限定类型(缺乏这样的约束在数据处理和交换应用中会出现问题)
- DTD 机制很难指定子元素的无序集合(就是说很难用正则表达式表达出来)(事实上,顺序在数据交换中很少有用处)
- ID 和 IDREF 没有类型的限定(这样无法指定 IDREF 属性应该引用的元素类型)
XML 模式
(为了弥补 DTD 机制的缺陷,发展出了一种更为完善的模式语言—— XML 模式)
XML Scheme:在标签上增加名字空间前缀 xs
注意:xs 这个前缀通过根元素 xmlns:xs 声明与 XML SCheme 名字空间相关联,也就是说是可以改的,不一定要用 ”xs:“ ,但是 XML Scheme 定义的所有类型必须都加上这个名字空间前缀
<xs:schema xmlns:xs=“http://www.w3.org/2001/XMLSchema”>
<xs:element name=“university” type=“universityType” />
<xs:element name=“department”>
<xs:complexType>
<xs:sequence>
<xs:element name=“dept name” type=“xs:string”/>
<xs:element name=“building” type=“xs:string”/>
<xs:element name=“budget” type=“xs:decimal”/>
</xs:sequence>
</xs:complexType>
</xs:element>
...
<xs:element name=“instructor”>
<xs:complexType>
<xs:sequence>
<xs:element name=“IID” type=“xs:string”/>
<xs:element name=“name” type=“xs:string”/>
<xs:element name=“dept name” type=“xs:string”/>
<xs:element name=“salary” type=“xs:decimal”/>
</xs:sequence>
</xs:complexType>
</xs:element>
...
<xs:complexType name=“UniversityType”>
<xs:sequence>
<xs:element ref=“department” minOccurs=“0” maxOccurs=“unbounded”/>
<xs:element ref=“course” minOccurs=“0” maxOccurs=“unbounded”/>
<xs:element ref=“instructor” minOccurs=“0” maxOccurs=“unbounded”/>
<xs:element ref=“teaches” minOccurs=“0” maxOccurs=“unbounded”/>
</xs:sequence>
</xs:complexType>
</xs:schema>