数据库 第23章 XML

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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Air浩瀚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值