XML的含义
XML(eXtensible Markup Language,可扩展标记语言)是一种用于存储和传输数据的标记语言。XML与HTML(HyperText Markup Language,超文本标记语言)类似,但XML的设计目的是描述数据,而HTML的设计目的是显示数据。
1. xml特点
- 可扩展性:用户可以定义自己的标签来精确描述数据。
- 自描述性:XML文档包含标签和数据,标签提供了数据的上下文和含义,使得数据易于理解。
- 平台无关性:XML是纯文本格式,可以在不同的操作系统和应用程序之间交换数据。
- 层次结构:XML文档使用嵌套的标签来创建数据的层次结构。
- 有效性验证:可以使用DTD(Document Type Definition,文档类型定义)或XML Schema来 定义XML文档的结构和规则,从而验证XML文档的有效性。
1.1 注意:
虽然XML功能强大,但其冗长和复杂的语法有时会导致解析和传输效率低下。JSON(JavaScript Object Notation)在某些情况下是XML的一个更轻量级的替代选择。
2.基本结构
- 文档声明:通常在XML文档的第一行声明XML版本和编码。例如:
<?xml version="1.0" encoding="UTF-8"?>
- 元素(Element):元素是XML文档的基本构建块,由开始标签、内容和结束标签组成。例如:
<book>Effective XML</book>
- 属性(Attribute):属性提供了元素的额外信息,并放在开始标签内。例如:
<book genre="computing">Effective XML</book>
- 注释:注释以
<!--
开始,以-->
结束,不被解析或显示。例如:<!-- This is a comment -->
XML
<?xml version="1.0"?>
<library>
<book>
<title>Sandman Volume 1:Preludes and Nocturnes</lib:title>
<author>Neil Gaiman</lib:author>
</book>
<book>
<title>Good Omens</lib:title>
<author>Terry Pratchett</lib:author>
</book>
<book>
<title>"Repent, Harlequin!"</lib:title>
<author>Harlan Ellison</lib:author>
</book>
</library>
3. 层次标记语言
- 它允许用户定义自己的标签(tags)
- 与语义标记语言不同,XML中的每条数据必须括在标签中。
- 数据封装在标签中,标签嵌套在层次中,该层次包含它封装数据的详细信息
- 顶层标签是文档的根,封装文档全部内容,每个XML文档只能有一个根。
3.1 名称空间
名称空间提供对标签的引用框架,并且被赋值了一个URL形式的唯一ID,外加用于该名称空间中的标签的一个前缀。如下:
本例创建了一个Library 名称空间,他的标识符是**http://server.domain.tld/NameSpaces/Library** ,前缀是lib:,我们可以使用该名称空间创建标签的引用框架。
XML
<?xml version="1.0"?>
<library:library xmlns:lib="http://server.domain.tld/NameSpaces/Library">
<!-- xmlns为命名空间的前缀 -->
<lib:book>
<lib:title>Sandman Volume 1:Preludes and Nocturnes</lib:title>
<lib:author>Neil Gaiman</lib:author>
</lib:book>
<lib:book>
<lib:title>Good Omens</lib:title>
<lib:author>Terry Pratchett</lib:author>
</lib:book>
<lib:book>
<lib:title>"Repent, Harlequin!"</lib:title>
<lib:author>Harlan Ellison</lib:author>
</lib:book>
</lib:library>
注意:
- 一个文档可以拥有和使用多个命名空间,上述示例只展示了一个命名空间
- 有些名称空间声明前缀是为XML和与其相关的语言预留的,例 xml: 、xmlns: 和xsl:...
- 名称空间的声明可以添加到文档的任意节点
- 命名空间内对此节点的所有子节点都有效
一组标准
XML只用来存储层次数据工具,NO!记住!它的强大之处在于:
- 它的可扩展性。
- 附带的一些标准:XSLT、XPath、模式和DTD语言,以及用来查询、链接、描述、显示和操作数据的一系列标准。
- XSLT:强大的转换引擎,将XML语言转换成其他语言,如HTML、纯文本、PDF...。
- XPath:描述XML节点集合的查询语言。
1. 模式/DTD语言
文档模型
概念
模式与DTD都是实现文档模型的方法,文档模型用以描述词汇和文档结构,利用它可以定义文档中将要出现的数据元素,元素之间的关系以及元素的数量。
文档模型的用途
处理文档之前,验证它的内容是否符合标准
是否需要?
如果程序本身能够预测即将接收到的数据,那就不需要
文档模型定义
DTD示例--将上述示例中的图书馆XML文档的描述转换为DTD格式:
XML
<!DOCTYPE config SYSTEM "library.dtd">
<!ELEMENT library (book+)>
<!ATTLIST library
owner CDATA #REQUIRED
>
<!ELEMENT book (title, author+)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
第一行代码是为了向前面的图书馆文件中添加对DTD的引用,library.dtd为系统DTD路径
- <!ELEMENT library (book+)>:表明有一个library元素,其含有一个或多个book类型的子元素
- 元素频率和元素分组操作符
- ? :指定0个或者1个前面出现的元素
-
- :指定一个或多个前面出现的元素
- , :指定一系列元素按此顺序出现
- ( ) :将元素组织在一起应用于()外的运算符适用于组内的所有元素
- | :'或'运算符
- * :指定元素出现0次或多次
- 元素频率和元素分组操作符
- <!ATTLIST library 指定图书馆元素有一个属性列表(不断更新) owner CDATA #REQUIRED 元素的属性列表 >
注意:
1.属性列表是与图书馆中元素的声明分开的,它与元素的名称链接起来,若元素名称变化,属性列表必须更新以指向新的元素名称
2.本例library只有一个属性,但是属性列表可以包含任意多个属性
3.属性的声明有三个强制元素:属性名称,属性类型和属性描述,其中:
- 属性类型:DTD规范指定的数据类型,要么是一组允许的值。
- 属性描述:指定属性的行为。这里可以给出属性的一个默认值。
DTD不全是XML
DTD的局限性
- 可借DTD表达复杂的结构,但维护起来很难
- 很难在文档模型中清楚表达数值范围
- 很难表达任意顺序的一些元素
- 不允许为数据指定模式
模式
模式来弥补DTD的不足,可提供基于XML的复杂语言,用以描述文档模型。同时可以清晰得指定数据得类型,使用re正则表达式描述字符数据模式,以及表达例如序列、选择和不受限制的模型的内容模型
模式是纯粹的XML
示例:
XML
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="library">
<xs:complexType>
<xs:sequence>
<xs:element name="book" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="title" type="xs:string"/>
<xs:element name="author" type="xs:string" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="owner" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
</xs:schema>
这篇文档1的顶层节点包含一个名称空间声明,指定了以xs:开头的所有标签属于由URL所标识的名称空间。这表明你拥有一个可用于验证模式的文档模型,使用的工具与验证其他XML文档的工具相同。
模式具有层次
pass
XPath
XPath:在XML文档中描述位置与节点集合的语言,XPath表达式包含对某个节点必须匹配的模式的描述。如果该节点匹配此模式,则被选中,否则,被忽略。