XML学习笔记
Abstract
XML技术是Internet技术的又一次革命。本笔记记录标记语言的历史和发展,还有我的学习历程。
Table of Contents
- 1. XML简介
- 2. XML语法
-
- 2.1. 基本语法规则
- 2.2. 良构XML文档和有效XML文档
- 2.3. XML文档的组成
- 2.4. XML文档树
- 3. DTD
-
- 3.1. 文档类型声明
- 3.2. 元素声明
- 3.3. 属性声明
-
- 3.3.1. 属性类型
- 3.3.2. 属性缺省值
- 3.4. 实体
- 4. XML名称空间
- 5. XHTML
- 6. 样式表
-
- 6.1. CSS2
- 6.2. XSLT
- 6.3. XPath
-
- 6.3.1. 匹配模式
- 6.3.2. XPath轴
- 6.3.3. 谓词
- 6.3.4. XPath表达式
- 6.3.5. XPath函数
- 6.4. XLink
- 7. 分析XML
-
- 7.1. 分析器工具
- 7.2. Unicode
- A. 附录
-
- A.1. 标记语言的历史
- A.2. XML相关技术名词解释
- A.3. XML应用
List of Tables
- 6.1.
- 6.2. XPath轴描述
- 6.3. 选择节点常用谓词
Chapter 1. XML简介
XML(eXtensible Markup Language,可扩展标记语言)是SGML的一个子集,但比SGML简单,用以创建可相互转换的结构化文本文档和数据文档。下面说明一下与XML相关的一些概念。
-
SGML(Standard Generalized Markup Language,标准通用标记语言),由于IBM公司的三位先驱者Charles GoldFarb、Edward Mosher和Raymond Lorie创立,主要作为大型文档的编制工具。DTD(Document Type Definition,文档类型定义)是SGML文档的核心,它定义了SGML文档必须遵循的一组语法规则。由于它很复杂,所以只是在一些大公司或大项目中使用。直到HTML面世,它还是默默无闻。
-
HTML(Hypertext Markup Language,超文本标记语言),它是在SGML框架中通过DTD定义的标记语言,是SGML的一种应用。它由于结构简单,容易学习而迅速普及,每个人都能很快地建立自已的页面,HTML造就了现时Internet上无数的信息资源。HTML标记只描述文档的外观,而不描述文档的内容本身–里面有什么。HTML是不明白网页内容的,这样就造成了内容搜索的差异和不确定性。另一个问题是,HTML不是可扩展的,这意味着没有一种方便的途径来扩展标记。每一个新标记的引入都会造成系统的不一致性和对标准的修订。这就是为什么现在我们用不同的浏览器浏览同一个网站时表现效果会有差异。
-
XHTML(eXtensible Hypertext Markup Language,可扩展超文本标记语言),它是按XML规则编写的HTML,由于有统一的规则约束,所以它不会出现如HTML一样的不规范、不一致性问题。
-
XML(eXtensible Markup Language,可扩展标记语言),继承了SGML的优点,但又没有了SGML的复杂性。XML专门为WEB应用而设计,和HTML不同,它是一种元标记语言(meta-markup language),也就是说它没有一套能够适用于各个领域中所有用户的固守的标签和元素,相反,它允许开发者根据自已的需要定义自已的元素,XML中的X(eXtensible)就是说明了这一点。它的特点有:
-
XML使用Unicode字符集,可生成英文、中文、希腊文或梵文等多种语言。
-
可将多个来源(包括其他XML文档和二进制文件)汇合进一个XML文档。
-
可利用DTD或Schema(模式)管理一致性问题。DTD主要用于文档型文档,Schema主要用数据型文档。
-
具有很好的扩展性,可定义自已的元素和属性。
-
通过XML可从关系数据库管理系统中提取数据到结构化文档。它还被设计成可对各种数据对象进行操作。
-
在一个设计良好的XML应用中,XML标记不涉及文档如何显示,只表示文档的结构。
XML被设计用来存储、支持和交换数据,而不是用来显示数据的。通常,XML被用于数据交换,而不是数据存储。 -
-
元数据,定义数据的数据。
-
标记语言是一种定义文档的格式语言。SGML、XML、XHML、HTML都属标记语言。
XML文档是什么?它有时是一个文件,有时是关系数据库中的一条记录,有时是由Object Request Broker(对象请求代理程序)传送的一个对象,有时是到达网络接口的一个字节流。XML文档可使不同系统、不同平台的数据实现统一接口,这就是XML真正的威力所在。下面列举几个使用XML的领域:
-
文档设计和管理,可利用XML维护公司的文档资料。
-
Web开发,利用XHTML和XSLT实现的Web页面扩展性更好,更容易维护。
-
数据库应用和程序开发,可从数据库中提取数据并生成XML文档,实现信息的跨平台、跨系统沟通。
-
定义其它语言,WML和WAP就是用通过XML建立的。
XML不是什么?
-
XML只是一种标记语言,不是一种编程语言。不存在一种编译器,把XML文档转化成可执行二进制代码。
-
XML不是一种网络传输协议,但通过网络协议传输的数据格式则可以是XML格式的。
-
XML不是数据库,不能替代Oracle或MySQL这类的关系数据库管理系统。
Chapter 2. XML语法
Table of Contents
- 2.1. 基本语法规则
- 2.2. 良构XML文档和有效XML文档
- 2.3. XML文档的组成
- 2.4. XML文档树
创建一个简单的index.xml文档:
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="basic.xsl"?> <basic>Hello World</basic>
下面创建一个名为basic.xsl的XML样式表(XSL),以便在浏览器中显示XML文档内容:
<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <head> <title>a basic stylesheet</title> </head> <body> <xsl:value-of select="/" /> </body> </html> </xsl:template> </xsl:stylesheet>
接着在浏览器中打开index.xml文档,则可显示“Hello World”。上面两个文档都是合法的XML文件,具体的语法规则下面会详细介绍,上例可先给大家一个感性的认识。
合法的XML文档可有种意思,一个是良构文档(well-format),即符合XML规则书写的文档;另一种是有效文档,是已验证符合一个DTD的文档。
2.1. 基本语法规则
-
XML是区分大小写的;
-
所有元素的起始和结束标注必须成对出现,且要正确嵌套;
-
如果使XML说明,则它必须是XML文档的第一行:
<?xml version="1.0"?>
-
元素属性必须用引号引起来,单、双引号都可以,但必须成对出现。如:
<basic attr="1.0"> <basic attr='1.0'>
-
XML命名规则:
-
XML名以下划线或字母开始;
-
XML名可包含字母、数字、句点、下划线和冒号;
-
XML名不能包含空格;
-
XML名不能以数字开始,但可包含数字;
-
XML名区分大小写。
-
-
保留标记字符,如果要在XML中显示<或&之类的标记,就要使用字符的实体形式,XML中有五种预先定义了的实体:
< 表示<字符 > 表示>字符 & 表示&字符 ' 表示'字符 " 表示"字符
我们也可用ENTITY自定义实体:
<!ENTITY linux "linux is a very good system"> 这样我们可用&linux;来调用。
-
XML文档内容中的空格是有意义的,在转换后会保留。
-
空元素以<开始并以/>结束,如<br/>。
2.2. 良构XML文档和有效XML文档
符合XML语法规则的XML文档称为良构文档,这些规则如下:
-
应当只有一个父标志,由父标志派生所有其它子标志,在一个文档中不能存在多个父标志。
-
嵌套元素应按正确的顺序开始和结束。
-
子标志应在父标志完成前关闭。
-
属性值应放在双引号中。
通过某个DTD或Schema验证的文档称为有效XML文档。
2.3. XML文档的组成
-
XML声明:
-
version,定义XML规范的版本号,到现在为止,只有一个版本号1.0。
-
encoding,指定文档的编码系统。
-
standalone,定义文档是独立的还是需要装入其他元素才能正确分析。如果XML文档没有外部实体或DTD,则可以设置为no,否则设置为yes。可用该值提高性能:如果为no,则可提高处理速度;如果设置为yes,则首先要分析文档,确定需要其他哪些文件,然后才能完全分析文档。
-
-
根元素,每篇XML文档都需要有且只能有一个根元素。由元素是文档的第一个元素,包含其它所有元素。下例的portal就是根元素,如:
<portal> <name>jims</name> <email></email> ... </portal>
-
属性,每个元素都可以设置一个或多个属性,如:
<portal> <name id='1',sex="male">Jims</name> </portal>
元素和属性都可以表示信息,什么时候使用元素,什么时候使用属性呢?属性信息表现能力有限,它只能表示字符串。所以当需灵活表示信息时应该使用元素。一般把信息主体放到元素中,属性只放一些注释或额外的信息。
-
CDATA部份,它用<![CDATA[和]]>表示,它们之间的数据作为原始字符显示,唯一不能出现的标志是]]>。
-
注释,注释是很重要,不论是在编写程序和文档时,所以XML也提供了注释功能,以<!–开头–>结尾的一对区间为注释。在以–>结束之前,不能出现“–”号,“—”更不允许。
-
处理指令,处理指令以<?开头以?>结尾。如PHP处理指令可写成,<?php … ?>。处理指令是标记,而不是元素。因此,与注释一样,处理指令可出现在XML文档的标签外的任何位置,包括根元素之前或之后。最常见的处理指令是,xml-stylesheet样式表指令,它会告诉浏览器在显示文档时应用什么样式表。如:
<?xml-stylesheet href="sample.css" type="text/css"?> <portal> <name>...</name> ... </portal>
2.4. XML文档树
XML文档是一种结构化的文档,可用树的形式表示出来。树是一种由节点和分支组成的简单结构,两个节点间由分支连接。上端的节点称为父节点,下端的节点称为子节点。一个节点如果没有父节点,则称为树的根节点(根),每个树必须有且只能有一个根节点。一个节点如果没有子节点,则称为树的叶节点。只有一个节点的树也是允许的。
Chapter 3. DTD
Table of Contents
- 3.1. 文档类型声明
- 3.2. 元素声明
- 3.3. 属性声明
-
- 3.3.1. 属性类型
- 3.3.2. 属性缺省值
- 3.4. 实体
由于XML可自定义标签,所以每个人定义的标签集都会不同,如果没有一套标准来规定标签的定义原则,则应用程序就不能对XML文档进行处理。解决该问题的方案采用DTD,DTD(Document Type Definition,文档类型定义),用于定义XML文档的编写规则。如哪些元素可出现在文档中,及元素的内容和属性的要求等。应用程序会利用这个DTD对文档进行检验,符合DTD约束规则的XML文档称之为有效文档,可以进行下一步处理,否则会报错,应用程序可捕获该错误进行相应的异常处理。检验过程是可选,这要视具体应用而定。
3.1. 文档类型声明
要使用DTD进行有效性检验,就要使用文档类型定义声明指定DTD。如:
<?xml version="1.0" standalone="no"?> <!DOCTYPE portal SYSTEM "http://www.w3c.com/dtd/portal.dtd"> <portal> <name>Jims</name> <email>Jims@163.com</email> <email>Jims@21cn.com</email> </portal>
文档类型声明位于XML声明之后,根元素之前。如果dtd文档位于本机,可用路径名直接指出dtd文档的位置。portal.dtd的内容如下:
<!ELEMENT portal (name,email*)> <!ELEMENT name (#PCDATA)> <!ELEMENT email (#PCDATA)>
上面的内容也可直接写到XML文档内,这种dtd声明方式叫内部dtd子集,如:
<?xml version="1.0" standalone="no"?> <!DOCTYPE portal [ <!ELEMENT portal (name,email*)> <!ELEMENT name (#PCDATA)> <!ELEMENT email (#PCDATA)> ]> <portal> <name>Jims</name> <email>Jims@163.com</email> <email>Jims@21cn.com</email> </portal>
如果dtd位于XML文档外,则叫外部dtd子集。我们可以结合内外dtd,共同组成一个dtd来为XML文档作验证。如:
<!DOCTYPE portal SYSTEM "external.dtd" [ <!ELEMENT portal (name,email*)> <!ELEMENT name (#PCDATA)> <!ELEMENT email (#PCDATA)> ]>
注意,使用内外dtd时,这两个dtd要互相兼容,不能有冲突。
3.2. 元素声明
上节文档类型声明中的每一项都是元素声明,定义了每个元素的约束。元素声明的格式为:
<!ELEMENT element_name (content_model)>
有效文档中使用的每个元素都必须在文档的DTD中用元素声明进行声明。element_name可是任何合法的XML名称,content_model(内容模型)指定元素可以或必须包含的子元素以及子元素的顺序。下面具体介绍内容模型的内容。
-
#PCDATA,规定元素只包含已析的字符数据。下面声明指出一个name元素可以包含文本,但不能划分为独立的area_code、number和extension元素:
<!ELEMENT name (#PCDATA)>
-
子元素,可指明元素的子元素。下面声明表示name元素必须包含且只包含一个desc元素。
<!ELEMENT name (desc)>
也可用逗号为分隔符,指明多个子元素。并且子元素出现的次序必须按定义时的顺序。如:
<!ELEMENT name (id,desc)>
name元素的id子元素必须在desc子元素前面,否则验证会出错,该文档不是一个有效的XML文档。
下面这个文档是有效的 <name> <id>1</id> <desc>dtd test</desc> </name> 下面这个文档是无效的,顺序颠倒了 <name> <desc>dtd test</desc> <id>1</id> </name> 下面的文档也是无效的,有多余的元素 <name> <id>1</id> <desc>dtd test</desc> <date>2005/01/31</date> </name>
-
子元素的个数,我们可通过正则表达式来规定子元素的个数。
-
?,允许零个或一个该元素
-
*,允许零个或多个该元素
-
+,允许一个或多个该元素
下面我们可利用这些符号规定id子元素必须出现,且只能出现一次,而desc子元素可选。
<!ELEMENT name (id,desc*)>
根据上面的声明,下面的name元素都是有效的。
<name> <id>1</id> <desc>dtd test</desc> </name> <name> <id>2</id> </name> <name> <id>3</id> <desc>dtd test</desc> <desc>another test</desc> </name>
-
-
可选项(|),选项是一个参数列表,每个参数间用“|”分隔,代表能且只能选一个子元素。
<!ELEMENT choice (good | bad)>
上例的choice元素可选一个good子元素,或bad子元素,且只能从选一个。可选的参数列可以多项,不限于两项。如:
<!ELEMENT choice (one | two | three | four)>
-
小括号,可用小括号把选项括起来,以表达更丰富的意思,如我们想表示choice元素必须包含一个good子元素,并且必须包含ok子元素或bad子元素的一个。
<!ELEMENT choice (good,(ok|bad))>
-
混合内容,在一些文档中,一个元素可能既包含子元素,也包含字符串,这些内容叫混合内容。可用以下方式表示:
<!EMEMENT description (#PCDATA | term)* )>
该声明表示description元素可包含已析的字符串和term子元素,且允许出现零次或多次,如:
<description> this is a <term>dtd</term> test. </description>
#PCDATA必须在第一位,可选的子元素可任意多项。
-
空元素,某些元素不用包含任何内容,称之为空元素。写成以/>结束的独立标签。
<!ELEMENT image EMPTY>
示例:
<image src="http://www.xml.com/dtd.jpg" />
-
ANY,允许元素内包含任意内容。该选项在dtd测试时很有用,在生产系统中尽量不要使用。
<!ELEMENT page ANY>
3.3. 属性声明
一个有效的XML文档,必须对元素的属性进行声明。使用ATTLIST声明来完成,一个ATTLIST可以为一个元素类型声明多个属性。
<!ATTLIST image src CDATA #REQUIRED>
上例声明image元素必须有一个src属性,该属性的值是字符数据。可用ATTLIST声明为一个元素声明多个属性,如:
<!ATTLIST image src CDATA #REQUIRED width CDATA #REQUIRED height CDATA #REQUIRED alt CDATA #IMPLIED >
上述声明指出src、width、height属性是必须的,alt属性是可选的。
3.3.1. 属性类型
-
CDATA类型属性值可包含任意文本字符串。DTD不能指定属性为一个整数或一个日期,Schema能提供更为强大的数据类型。
-
NMTOKEN类型属性值是一个XML名称记号。XML名称记号与XML名称类似,但XML名称记号允许所有的字符作为名称的开始字符,而XML名称的第一个字母必须是字母、表意字符和下划线。因此10,.bashrc是合法的XML名称标记,但不是合法的XML名称。每个XML名称都是一个XML名称标记,然而XML名称标记不全是XML名称。如果属性包含1990,2005之类的整数,则应该指定其类型为NMTOKEN。如:
<!ELEMENT person birthday NMTOKEN #REQUIRED>
-
NMTOKENS类型属性包含一个或多个用空白分隔的XML名称记号。如:
<person dates="02-01-2005 03-01-2005 05-01-2005">person</person>
对应的声明应为:
<!ATTLIST person dates NMTOKENS #REQUIRED>
另一方面,对01/02/2005这样的形式不能使用该声明,因为其中的正斜杠不是合法的名称字符。
-
枚举声明,枚举不用关键字。直接列举所有的值,中间用竖线分隔。如:
<!ATTLIST date month(January | February | March | April | May | June | July | August | September | October | November | December) #REQUIRED>
针对上述声明,date元素的month属性可选十二个月份的中一个。
-
ID类型的属性必须包含一个XML名称,而且该名称在文档中是独一无二的。ID属性可为元素分配一个唯一的标识符。
<!ATTLIST name card_id ID #REQUIRED>
由于数字不是合法的XML名称,所以ID编号不能以数字开头,解决办法是在前面加下划线或字母。
-
IDREF类型的属性指向文档中某元素的ID类型的属性。因此,它必须是一个XML名称,它的作用是当简单的包含关系不能满足要求时在元素间建立多对多关系。如:
<project project_id="p1"> <goal>deploy linux</goal> <team_member person_card_id="c123"> </project> <person card_id="c123"> <name>linuxsir</name> <assignment project_project_id="p1"> </person>
project元素的project_id属性和person元素的card_id属性应该是ID类型。team_member元素的person_card_id属性和assignment元素的project_project_id属性是IDREF类型。对应的声明如下:
<!ATTLIST person card_id ID #REQUIRED> <!ATTLIST project project_id ID #REQUIRED> <!ATTLIST team_member person_card_id IDREF #REQUIRED> <!ATTLIST assignment project_project_id IDREF #REQUIRED>
-
IDREFS类型的属性包含一个XML名称列表。名称间用空白间隔,且每个名称都是文档中某个元素的ID。当某个元素需要引用多个其他元素时使用该元素。如:
<!ATTLIST person card_id ID #REQUIRED assignment IDREFS #REQUIRED> <!ATTLIST project project_id ID #REQUIRED team IDREFS #REQUIRED>
对应的文档可写成:
<project project_id="p1" team="c123"> <gold>deploy linux</gold> </project> <person card_id="c123" assignment="p1"> <name>Linuxsir</name> </person>
-
ENTITY类型的属性包含在DTD的其它位置声明的未析实体的名称中。如movie元素可能有一个标识激活时播放mpeg或rm文件的实体属性:
<!ATTLIST movie src ENTITY #REQUIRED>
如果DTD声明了一个名为play的未析实体,则此movie元素可用于在XML文档中嵌入视频文件:
<movie src="play" />
-
ENTITIES类型的属性包含在DTD的其它位置声明的多个未析实体名称,其间用空白隔开。
<!ATTLIST slide_show slides ENTITIES #REQUIRED>
如果DTD声明了未析实体slide1、slide2、slide3、…,则可使用slide_show元素在XML文档中嵌入幻灯片。
<slide_show slides="slide1 slide2 slide3" />
-
NOTATION类型的属性包含在文档的DTD中声明的某个记法的名称。该属性类型较少用。理论上,可以使用该属性使某些特殊元素与类型相关联,下例声明为不同的图像类型定义了4个记法,然后规定每个image元素都必须从中选择一种type属性。
<!NOTATION gif SYSTEM "image/gif"> <!NOTATION tiff SYSTEM "image/tiff"> <!NOTATION jpeg SYSTEM "image/jpeg"> <!NOTATION png SYSTEM "image/png"> <!ATTLIST image type NOTATION (gif | tiff | jpeg | png) #REQUIRED>
每个image元素的type属性的值可以为gif,tiff,jpeg和png四个值中的一个。该属性比枚举类型稍具优势,因为记法的实际MIME媒体类型在理论上是可用的。由于斜杠在XML名称中不是一个合法字符,所以枚举类型不能指定image/png或image/jpeg作为允许值。
3.3.2. 属性缺省值
每个ATTLIST声明除了要提供一种数据类型外,还要声明属性的缺省行为。
-
#IMPLIED,属性可选。
-
#REQUIRED,属性必须有。
-
#FIXED,属性是常量,不能更改。
<!ATTLIST person name CDATA #FIXED "linuxsir"
-
Literal,作为一个引用字符串的实际缺省值。
<!ATTLIST person name NMTOKEN "linuxsir"
如果没有显示指明person元素的name属性,则该值为linuxsir。
3.4. 实体
-
用ENTITY声明定义实体。如:
<!ENTITY linux "linux is a very good system"> 用&linux;可引用该字符串
-
可定义一个外部实体,引用外部XML文档
<!ENTITY linux SYSTEM "/home/linux/test.xml"> 使用&linux;可引用/home/linux/test.xml文档
外部实体没有XML声明,但可以有文本声明,两者很类似,主要区别是文本声明必须有编码声明,而版本信息则是可选的。
<?xml version="1.0" encoding="gb2312"?> 是一个合法的文本声明 <?xml encoding="gb2312"?> 也是一个合法的文本声明
-
不是所有的数据都是XML。如jpeg照片,mpeg电影等。XML建议使用外部未析实体作为在文档中嵌入这些内容的机制。DTD为包含非XML数据的实体指定一个名称和URI。
<!ENTITY movie SYSTEM "/home/linux/test.avi" NDATA avi>
由于数据不是XML格式,所以使用NDATA声明指定数据类型。avi是在NOTATION中定义的MIME媒体类型。在XML中嵌入未析实体很复杂且不规范,尽量不要使用。
-
参数实体可定义一组通用的实体,在文档中可通过该参数实体来引用实体。参数实体的定义与通用实体定义类似,只是中间多了一个%,引用时也是用%代码&。
<!ENTITY % person "name,address,postcode"> 引用方法 %person; 这样会用name,address,postcode代替参数实体%person;
-
通常DTD都比较大,DocBook的DTD长达11000多行,如果把它存放在单一文件中,管理和维护起来都非常困难。我们可以使用外部DTD子集,把一个大的DTD按功能分成不同的功能块,存放在不同的文件中。再通过外部参数实体声明引入当前DTD中,如:
定义参数实体引用外部names.dtd <!ENTITY % names SYSTEM "names.dtd"> 调用外部DTD子集 %names;
-
使用IGNORE关键字可注释声明,如:
<![IGNORE[ <!ELEMENT note (#PCDATA)> ]]>
当然了,使用<!– 注释 –>的方式也是一样的。
-
INCLUDE关键字表示DTD中的确在使用给定的声明,如:
<![INCLUDE[ <!ELEMENT note (#PCDATA)> ]]>
单从该声明来看,有没有使用INCLUDE效果都一样,但如果组合INCLUDE和IGNORE,可实现DTD功能的选择。我们可定义一个参数实体:
<!ENTITY % note_allowed "INCLUDE" >
然后使用参数实体引用而不使用关键字:
<![%note_allowed;[ <!ELEMENT note (#PCDATA)> ]]>
按上述操作,元素声明是有效的,但我们也可以把参数实体%note_allowed重新定义为IGNORE,这样,该元素声明就无效了。
Chapter 4. XML名称空间
-
XML名称空间表示XML名称的使用范围,因为XML可自定义元素标签,所以有不同XML应用间XML名称重名的机会是很大的。如果没有一种方法来区分不应用的名称,就会造成混乱。XML名称空间就是为了解决这个问题而设计的。通过XML名称空间,我们可以区分来自不同的XML应用的具有相同名称的元素和属性。可以将来自单一XML应用的相关元素和属性集合在一起,方便软件识别和处理。
-
名称空间由前缀和本地部分组成,中间用冒号分隔。前缀标识元素或属性的所在名称空间,本地部分标识名称空间中的某个元素或属性。整个名称也称为限定名称(qualified name)。前缀可以用除XML(大小写任意组合)三个字母外的任何合法的XML名称字符组成。每个限定名称中的前缀都必须与唯一的一个URI关联。带有相同URI关联的前缀的名称属于同一名称空间。
<rdf:RDF xmlns:rdf="http://www.w3.org/TR/REC-rdf-syntax#"> <rdf:Description about="http://www.example.com/test.xml"> <title>example</title> <author>linuxsir</author> ... </rdf:Description> </rdf:RDF>
上例rdf:RDF元素的xmlns:rdf属性将前缀rdf绑定到名称空间http://www.w3.org/TR/REC-rdf-syntax#。属性xmlns:rdf为rdf:RDF元素及其子元素声明了前缀rdf。RDF处理器将把rdf:RDF和rdf:Description作为RDF元素,因为两个元素都具有与RDF规范定义的某个URI相绑定的前缀。处理器不会认为title,author等元素为RDF元素,因为它没有绑定到相同URI的rdf前缀。
前缀一般在使用该前缀的最上层元素中定义。在下层元素中也可定义不同的前缀:
<rdf:RDF xmlns:rdf="http://www.w3.org/TR/REC-rdf-syntax#"> <rdf:Description xmlns:dc="http://www.w3.org/dc/" about="http://www.example.com/test.xml"> <dc:title>example</dc:title> <dc:author>linuxsir</dc:author> ... </rdf:Description> </rdf:RDF>
不带前缀的属性,如about,不属于任何的名称空间。如xlink:type和xlink:href属性属于xlink名称空间,当然,前提是你要先把xlink绑定到一个URI。URI不必须是一定存在的http链接,它只是一种表示的方法,以区分不同的名称空间。
-
通过将无前缀的xmlns属性附加到根元素中,可以指定不带前缀的元素及所有不带前缀的子元素属于某个名称空间。
<svg xmlns="http://www.w3.org/2000/svg"> <ellipse rx="110" ry="130" /> <rect x="4cm" y="1cm" /> </svg>
这里,虽然所有元素都没有前缀,但它都同属一个名称空间。但属性属不同名称空间,因为默认名称空间只应用于元素。默认名称空间在子元素中也用相同的方法重新设置。
-
如果名称空间只用来识别来自某种XML应用的元素和属性,而不是用来区分具有相同名称的不同元素,则可在DTD的元素中定义一个固定的xmlns属性,而不需要文档中定义。定义方法如下:
<!ATTLIST svg xmlns CDATA #FIXED "http://www.w3.org/svg/">
-
在定义DTD时,需要使用名称空间前缀的在定义时也要把前缀写到DTD定义里,如:
<!ELEMENT xlink:name (#PCDATA)>
-
使用参数实体引用来定义名称空间前缀可方便DTD文档的维护,如:
<!ENTITY % prefix "xlink"> <!ENTITY % colon ":">
接着,利用该参数实体名称定义更多的参数实体引用,如:
<!ENTITY % xlink-title "%prefix;%colon;title"> <!ENTITY % xlink-author "%prefix;%colon;author">
这样,如果需更改前缀,只需修改一个地方就可以了,不用整篇文档修改。
<!ELEMENT %xlink-title; (#PCDATA)> <!ELEMENT %xlink-author; (#PCDATA)>
不能在ATTLIST和ELEMENT声明中直接使用%prefix;和%colon;,因为在另一个实体的外部使用这些参数实体时,XML解析器会在实体替换文本的两边添加额外的空格。