XML的产生?
XML的全称是Extensible Markup Language,意思是可扩展的标记语言,它是标准通用标记语言(Standard Generalized Markup Language, SGML)的一个子集。SGML功能非常强大,是可以定义标记语言的元语言。
W3C组织于2004年2月4日,发布了XML1.1的推荐标准,这是最新的XML版本,不过目前大多数的应用还是基于XML1.0的推荐标准。
HTML是在SGML定义下的一个描述性的语言,这是SGML的一个应用,其DTD作为标准被固定下来,而XML是SGML的一个简化版本,是SGML的一个子集,严格意义上来说,XML仍然是SGML。
XML与HTML的比较
◆ XML将数据与显示分开
◆ XML对文档的格式要求严格
■ 开始标签必须要有一个结束标签
■ 空元素标签必须被关闭
◆ 所有的标签都区分大小写
◆ 所有的标签都必须合理嵌套
◆ 所有的标签都区分大小写
◆ XML有且只能有一个根元素
XML文档在逻辑上主要有以下五个部分组成。
——XML声明
XML文档信息总是以一个XML声明开始,其中指明所用的XML版本,文档的编码,文档的独立性信息,其格式如下:
<?xml 版本信息 [编码信息][文档独立性信息]?>
<?xml version="1.0" encoding="gb2312" standalone="yes"?>
XML的声明必须位于文档的第一行,前面不能有任何字符。
——文档类型声明
DTD(Document Type Definition),文档类型定义。 XML从SGML继承了用于定义语法规则的DTD机制,但DTD本身并不要求遵循XML规则,几乎所用的XML应用都是使用DTD来定义的,HTML就有一个标准的DTD文件,所以其组织结构和所有的标签都是固定的,DTD文件也是一个文本文件,通常用”.dtd”作为其扩展名。
通过文档类型声明,指出XML文档所用的DTD,文档类型声明有两种形式。
一种是声明DTD在一个外部的文件中,如下:
<!DOCTYPE greeting SYSTEM “hello.dtd”>
一种是直接在XML文档中给出DTD,如下:
<?xml version=”1.0” encoding=”gb2312” standalone=”yes” ?>
<!DOCTYPE greeting[<!ELEMENT greeting(#PCDATA)>]>
——元素
◆在XML中,元素由开始标签,元素内容和结束标签构成,对于空元素由空元素标签构成。
◆每一个元素有一个用名字标识的类型,同时它可以有一个属性说明集,每一个属性说明有一个名字和一个值。
◆在给元素命名的时候要注意,以”xml”或者其他任何匹配((‘X’|’x’)(‘M’|’m’)(‘L’|’l’))的字符串开头的名字,被保留用于XML规范的当前版本或后续版本的标准化。此外,在给元素命名时,还要遵守下列规范:
1.名称只能以字母、下划线(_)或者冒号(:)开头
2.名称中可以包含字母、数字、下划线以及其它在XML标准汇总允许的字符;
3.名称中不能包含空格;
4.名称中尽可能不要使用冒号(:),因为冒号在名称空间中被用于分隔名称空间前缀和本地部分。
元素的四种类型
1. 空元素 <student/>
2. 带有属性的空元素<studeng name=”张山” age=”18”/>
3. 带有内容的元素
<student>
this is a information of student
<name>shan</name>
<age>18</age>
<student>
4. 带有内容和属性的元素
<student name=”shan”>
<age>18</age>
</student>
提示:“元素”和“标签”这两个词具有不同的含义。元素是指开始标签、结束标签以及两者之间的一切内容,包括属性、文本、注释、以及子元素。标签是一对尖括号(<>)和两者之间的内容,包括元素名和所有属性。例如:<font color=”blue”>是一个标签,</font>也是一个标签;而<font color=”blue”>Hello World</font>则是一个元素。
元素的内容可以包含子元素、字符数据、字符引用和实体引用、CDATA段
在一个元素的内容中,字符数据可以是不包括任何标记的起始定界符和CDATA段的结束定界符的任意字符串,也就是说在元素的内容中,字符数据不能有和号(&)和小于号(<),也不能有字符串”]]>”
在CDATA段中,字符数据可以是不包括CDATA段的结束定界符的任意字符串。
在XML中,提供了5个预定义的实体引用,分别引用XML文档中的5个特殊字符:小于号(<)、大于号(>)、双引号(“)、单引号(‘)、和号(&)这5个特殊字符也可以通过字符引用的方式去引用。
字符应用和预定义实体引用都是以一个和号(&)开始并以一个分号(;)结束,如果用的是字符引用,需要在和号(&)之后加上一个#,之后是所需字符的十进制代码或十六进制代码(ISO/IEC 10646字符集中字符的编码),如果用的预定义的实体引用,在和号(&)之后写上字符的助记符。
字符 |
字符引用(十进制代码) |
字符引用(十六进制代码) |
预定义实体引用 |
< |
< |
< |
< |
> |
> |
> |
> |
“ |
" |
" |
" |
‘ |
' |
 |
' |
& |
& |
& |
& |
CDATA段中包含的都是纯字符数据,在字符数据可以出现的任何地方都可以使用CDATA段。
CDATA段主要用于需要将整个文本解析为字符数据而不是标记的情况下,CDATA段中的内容不被XML处理器分析,所以可以在其中包含任意的字符。
CDATA段以字符串”<![CDATA[”开始,以字符串”]]>”结束。
——注释
在XML文档中,注释可以出现在文档中其他标记之外的任何位置,另外,它们还可以在文档类型声明中语法(grammar)允许的地方出现。
XML的注释和HTML的注释类似,都是以<!-->开始以—>结束。位于<!----和--->
之间的数据将被XML处理器忽略。如:<!---This is a comment-->
1. 注释不能出现在XML声明之前,XML声明必须是文档最前面的部分。
2. 注释不能出现在标记中。
3. 字符串”-”(双连字符)不能在注释中出现。这即意味着,我们在注释中书写的程序代码的时候,不能出现类似于i—或—i这样的代码
4. 在XML中,不允许注释以-à结尾。
——处理指令
处理指令(Processing instructions,简称Pis),允许文档中包含由应用程序来处理的指令。在XML文档中,有可能包含一些非XML格式的数据。这些数据XML处理器无法处理,我们就可以通过处理指令来通知其他应用程序来处理这些数据。
处理指令(PI)的语法和XML声明类似,以<?开始,以?>结束,一个常见的使用样式表单的处理指令如下所示:
<?xml-stylesheet href=”hello.css” type=”text/css”?>
在开始标记<?后的第一个字符串xml-stylesheet叫做处理指令的目标。它必须标示要用到的应用程序。要注意的是对于其他非W3C定义的处理指令不能以字符串”XML”和”xml”开头,其余对的部分是传递给应用程序的字符数据,应用程序从处理指令中取得目标和数据,执行要求的动作。
处理指令可以放在除标记的内容和XML声明之前的任何位置。
要注意,虽然XML声明和处理指令的语法形式相似,但XML声明并不是处理指令,XML处理程序对XML声明和处理指令采取的是不同的处理方式。
空白处理(white space Handling)
在XML规范中,空白包括空格、制表符和空行。
XML处理器总是将文档中不是标记的所有字符都传给应用程序,一个进行有效验证的XML处理器会通知应用程序这些字符中的哪一些组成了出现在元素内容中空白。
在XML文档中,可以在元素中使用一个特殊的属性xml:space,来通知应用程序保留此元素中的空白。
在有效的文档中,这个属性和其它任何属性一样,在使用时必须声明,xml:space属性必须被声明为Enumerated(枚举)类型,它的值必须是”default”和”preserve”两者之一,也可以两个都取。例如:
<!ATTLIST poem xml:space (default|prserve) ‘preserve’>
<!ATTLIST pre xml:space (preserve) #FIXED ‘preserve’>
XML数据经常以文本的方式保存在计算机文件中,以行来分隔。然而,不同的计算机系统采用的行分隔符是不同的,在XML空白字符中,有两个是标注的ASCII码行尾控制字符;回车(CR, #xA)和换行(LF, #xD)。在Windows平台下,采用#xD#xA的组合作为行分隔符,而在Linux,Unix系统则采用#xA作为行分隔符,在MacOS下,采用#xD作为行分隔符。
为了简化应用程序的工作,XML处理器在解析前,要将所有的两字符序列#xD#xA,以及单独的#xD字符转换成单个的#xA字符。
语言标示
在文档处理中,标识出其内容所使用的自然或人工语言常常是很有用的。
可以在文档中插入一个特殊的属性xml:lang,来指明xml文档中任何元素的内容和属性的值所使用的语言,在有效的文档中,这个属性和其它任何属性一样,在使用时必须声明。
xml:lang属性的值是在IEIF RFC3066(Tags for the identification of Language)或它的后继版本汇总定义的语言标记符,另外,也可以为其指定空字符串。
<content xml:Lang=”en”>
DTD(Document Type Definition),文档类型定义。
在XML标准中,描述了如何创建DTD,以及如何将它与根据它的规则所编写的XML文档进行关联,并且还定义了XML处理器应该如何对DTD进行处理。有了DTD就可以检测XML文档的结构是否正确。
DTD为XML文档的编写者和处理者提供了共同遵循的原则,使得与文档相关的各种工作有了统一的标准。
内部DTD
文档类型声明由<!开始,后面出现一个关键字DOCTYPE,然后是文档根元素的名称,接下来是标记声明块,标记声明块是放在左中括号([)和右中括号(])之间的,有一个或多个标记声明构成,最后有>结束。
在DTD中,所有的关键字都是大写的,不过,在DTD中定义的元素和属性的大小写是可以任意指定的,但是要注意,因为XML文档时大小写相关的,所以一旦给一个元素命名,那么在整个文档中要使用相同的大小写。例如:greeting和Greeting是两个不同的元素名。
使用PUBLIC关键字的声明语法如下:
<!DOCTYPE 根元素的名称 PUBLIC “DTD的名称” “外部DTD文件的URI”>
PUBLIC关键字用于声明公共的DTD,并且这个DTD还有一个名称,“DTD的名称”也称为公共标示符(public identifer)。这个DTD可以存放在某个公共的地方,XML处理程序会根据名称按照某种方式去检索DTD,如果XML处理器不能根据名称检索到DTD,就会使用”外部DTD文件的URI”(系统标识符)来查找该DTD.
DTD名称与XML名称略有不同,它们只能包含ASCII字母和数字字符、空格、回车符、换行符和一些标点符号:
公共DTD名称要遵守一些约定,如果一项DTD是ISO标准,它的名字要以字符串”ISO”开始,如果是一个非ISO的标准组织批准的DTD,它的名字以加号(+)开始,如果不是标准组织批准的DTD,它的名字以连字符(-)开始。这些开始字符或字符串后接双斜杠(//)和DTD所有者的名字,只后事另一个双斜杠和DTD描述的文档类型,接着又是一个双斜杠后接ISO639语言标识符,如EN标示英语,ZH标示中文。
注意:
文档类型声明和文档类型定义不是一个概念,DTD是文档类型定义(Document Type Definition)的应为缩写。
<!DOCTYPE greeting SYSTEM “hello.dtd”>是文档类型声明。
<!ELEMENT greeting (#PCDATA)>这种语法是文档类型定义。
文档类型声明可以包含(内部DTD子集)或引用(外部DTD子集)一个文档类型定义,但文档类型定义从不包含文档类型声明。
元素类型声明:
1. 元素类型声明不但说明了每个文档中可能存在的元素,给出了元素的名称,而且给出了元素的具体类型。
2. 一个XML元素可以为空,也可以只包含字符数据,还可以有若干个子元素,而这些子元素同时又可以有它们的子元素。
3. 元素类型声明采用如下的语法格式:
<!ELEMENT 元素名称 元素内容说明>
元素内容说明可以指明五种可能的元素内容形式:#PCDATA、子元素、混合内容、EMPTY和ANY.
元素内容说明:混合内容。
1. 说明元素既可以包含字符数据,也可以包含子元素。
2. 混合内容必须被定义零个或多个。
3. 例子:
<?xml version=”1.0” encoding=”gb2312”>
<!DOCTYPE employee [
<!ELEMENT employee(#PCDATA|name)*>
]>
在使用混合内容模型时,#PCDATA关键字必须是模型中的第一个选项,不能再模型中使用逗号、问号、加号、用整线分隔符的#PCDATA和元素的列表时合法的,其他用法都是不合法的。
元素内容说明-EMPTY
关键字EMPTY表明该元素即不包括字符数据,也不包含子元素,是一个空元素。
如果在文档中元素本身已经表示了明确的含义,就可以在DTD中用关键字EMPTY来声明空元素.例如:
<!ELEMENT br EMPTY> 表明br是一个没有内容的空元素。
元素内容说明-ANY
关键字ANY表明该元素可以包含任何的字符数据和子元素,只要它们不违反XML格式良好的约束就可以了,例如:<!ELEMENT employee ANY>
表明employee可以包含任何形式的内容。
尽量避免使用ANY.
实体声明
@有两种类型的实体:一般实体(general entity)和参数实体(parameter entity)。
@一般实体是在文档内容中使用的实体,而参数实体则是在DTD中使用的已分析实体。
@不管是一般实体,还是参数实体都是用ENTITY关键字来声明。
@一般实体的声明语法如下:<!ENTITY 实体名 "实体内容">
引用实体的方式为:"&实体名"。
参数实体只能在DTD中使用,它的声明语法如下:
<!ENTITY % 实体名 "实体内容">
注意在声明时,ENTITY,%和实体名之间各有一个空格,引用实体的方式为:
%实体名;".
@在内部sDTD子集中,参数实体引用不能在标记声明内部出现,可以在标记声明允许出现的地方出现,对于外部DTD子集,则没有这个限制。
@在DTD中,所有的参数实体必须在引用之前进行声明。这意味着内部DTD子集不能应用在外部DTD中声明的参数实体,这是因为XML处理器将首先读取内部子集,也就是说,内部子集中的实体和属性表声明的优先级要不在外部子集中的高。
@内部实体在XML文档中内部定义,实体的内容在声明中给出,内部实体都是已分析的实体,它们没有单独的物理存储对象。
@外部实体在单独的(外部)文件中定义,外部实体可以是已分析实体,也可以是未分析实体,外部一般实体的声明形式如下:
<!ENTITY copyright SYSTEM "http://www.sunxin.org/copyright.xml">
关键字SYSTEM表明这是一个私有的外部一般实体,后面的URI称为该实体的系统标识符,用于给出外部文件的位置。
Copyright.xml文件的内容为:
<?xml version="1.0" encoding="gb2312"?>
?#169;2004,程序员之家,All Rights Reserved
<?xml version="1.0" encoding="gb2312"?>称为文本声明,文本声明类似于XML声明,不过文本声明没有standalone属性,并且version属性也是可选的,外部已分析实体可以使用不同于UTF-8的编码,使用文本声明来指明实体内容的编码方式。
@也可以使用PUBLIC关键字来声明公共的外部一般实体,其声明形式和使用了关键字PUBLIC的外部DTD声明类似。如下:
<!ENTITY open-hatch PUBLIC "-//Textuality//TEXT Standard open hatch boilerplate//EN" "http://www.textuality.com/boilerplate/OpenHatch.xml">
//Textuality//TEXT Standard open hatch boilerplate//EN 为该实体的公共标示符。后面的URI部分为该实体的系统标示符。
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE cp [
<!ELEMENT cp (name,version)>
<!--
<!ELEMENT name (#PCDATA)>
-->
<!ENTITY % name2 "<!ELEMENT name (#PCDATA)>">
%name2;
<!ELEMENT version (#PCDATA)>
<!ENTITY % name "程序员之家">
<!ENTITY copyright "©2005,程序员之家; All Rights Reserved.">
]>
<!--
<!DOCTYPE cp SYSTEM "cp.dtd">
-->
<cp>
<name>%name;</name>
<version>©right;</version>
</cp>
属性表声明
属性用于将名字-值对与元素进行关联,属性声明只能在开始标签和空元素标签中出现,属性表声明详细说明了与给定元素类型相关联的每一个属性的名字,数据类型和缺省值(如果有的话)
属性表声明的语法如下:
<!ATTLIST 元素名 属性名 属性类型 缺省声明>
元素名师属性所属的元素的名字,属性名是属性的命名,属性类型则是用来指明该属性的属性属于那种类型,共有十种类型,缺省声明用于说明在元素该属性是否必须出现,如果不是必须出现,那么当该属性没有出现时,XML处理器该如何处理。
缺省声明可以有四种缺省设置,#REQUIRED,#IMPLIED,#FIXED+缺省值,只有缺省值。
#REQUIRED关键字说明必须为该元素提供该属性。
#IMPLIED 关键字IMPLIED说明元素可以包含该属性,也可以不包含该属性。
#FIXED+缺省值
关键字FIXED+缺省值,说明一个固定的缺省值,文档的编写者不能修改该属性的值,如果元素中不包含这个属性,XML处理器将以声明的缺省值向应用程序报告该属性。
只用缺省值
与FIXED+缺省值一样,如果元素不包含该属性,XML处理器将以声明的缺省值向应用程序报告该属性,不同的是,这种声明方式属性的值是可以改变的。
属性类型
在属性表声明时,总共有十种属性类型可以选择,分别是:CDATA、Enumerated、ID、IDREF、IDREFS、ENTITY、ENTITLES、NMTOKEN、NMTOKENS、NOTATION。
CDATA
这是最常用的一种属性类型,表明属性值为字符数据,与元素内容说明中的#PCDATA相同,如果属性值需要出现小于号(<)和双引号("),可以通过预定义实体引用或字符引用的方式插入小于号和双引号,如果包含的和号(&)不是字符或实体引用的起始定界符,也必须使用预定义实体引用或者字符引用的方式插入。
Enmumerated
在声明属性时,可以限制属性的取值只能从一个列表中选择,这类属性属于枚举类型。枚举类型的属性有时候是很有用的,例如:person元素由一个sex属性,我们希望这个属性的取值只能是male或female,在声明属性时,将这两个值放到圆括号中,并用竖线(|)分隔,如下所示:
<!ATTLIST person sex (male|female) #REQUIRED>
列表中的可选属性值,不用加双引号(")或单引号('),但是在给属性时,需要带上双引号或单引号,另外要注意的是,在给属性赋值时,不仅必须使用枚举类型生命中的可选值,而且还要声明属性值的大小写,Male,MALE,Female等都是无效的。
ID、IDREF、IDREFS
一个ID类型的属性值惟一标示XML文档中的一个元素。
一个ID类型的属性值必须遵守XML名称定义的规则,以字母、下划线或冒号开头,名称中可以包含字母、数字、下划线以及其它在XML标准中允许的字符,名称中不能带有空格。
一个元素只能有一个ID类型的属性,ID类型的属性必须设置为#IMPLIED或者REQUIRED,因为ID类型属性的每一个取值都是用来标识一个特定的元素。为ID类型的属性提供缺省值,特别是固定的缺省值是毫无意义的。
IDREF类型
IDREF类型的属性值为同一文档中另一个元素的ID类型的属性值,而这另一个元素的ID类型的属性值必须是存在的。
利用ID和IDREF这两种类型的属性值,我们可以在两个对象之间建立一种关联关系。
IDREFS
如果一个属性需要引用文档中多个ID类型的属性值,那么可以而把它声明为具有IDREFS类型。IDREFS类型的属性值是一些列以空格分隔的ID类型的属性值,而且必须与文档中已有的ID类型属性值相匹配。
ENTITY、ENTITYS
ENTITY类型的属性把外部的二进制数据链接到文档。
ENTITY类型的属性值是在DTD中声明的未分析的一般实体的名称。
例如,我想在文档中包含一幅外部的图像,可以声明一个ENTITY类型的属性来引入图像,如下:<!ATTLIST image src ENTITY #REQUIRED>
在DTD中,还需要声明一个外部的一般实体:
<!ENTITY logo SYSTEM "http://www.sunxin.org/logo.gif" NDATA gif>
关键字NDATA表示该实体是一般未分析的实体。后面的gif是记号名称(notation name),说明实体的数据格式或指定一个外部的处理程序,记号gif的声明如下:
<!NOTATION gif SYSTEM "iexplore.exe">
在XML文档中,可以在src属性中引用图像:
<image src="logo"/>
这句代码是将http://www.sun.org/logo.gif文件与image元素关联在一起。
ENTITIES类型和IDREFS类型的使用是类似的,它的值是多个以空格分隔的ENTITY类型的属性值。
例如,我们可以再添加一个实体声明:
<!ENTITY banner SYSTEM "http://www.mybole.com.cn/banner.gif" NDATA gif>
然后将元素image的属性改为:
<!ATTLIST image src ENTITIES #REQUIRED>
在XML文档中,通过src属性引用两幅图像:
<image src="logo banner" />
NMTOKEN、NMTOKENS
NMTOKEN(name token),名称标记是任何命名字符的混合体。
NMTOKEN类型的属性值是受限制的文本,只能包含名称字符,不能包含空白字符。
为了限制文件属性的取值不能有空格,我们可以采取如下的属性声明方式,
<!ATTLIST file name NMTOKEN #REQUIRED>
在文档中,可以按如下方式使用name属性:
<file name="XML讲座.doc">
NMTOKENS类型与IDREFS和ENTITIES类似,它的值由多个名称标记构成,每个名称必须是有效的名称标记,它们之间必须以空格分隔,例如在DTD中声明:
<!ATTLIST files name NMTOKENS #REQUIRED>
在文档中使用:
<files name="dd,doc ff.doc">
在现实中,有很多数据都是无法用XML来表示的,例如:声音,图像,影像等,对于这些数据,XML处理器通常都不支持。
通过DTD的记号声明(notation declaration),为非XML数据描述一种可能的格式,或者指定一个外部的处理程序。
记号声明有两种格式,一种是使用MIME类型。形式如下:
<!NOTATION gif SYSTEM "image/gif">
另一种是使用URI路径,指出外部处理程序的位置。
如下:<!NOTATION gif SYSTEM "iexplorer.exe">
对于记号声明,也可以使用PUBLIC关键字来代替SYSTEM关键字,并添加公共的名称和URI(用法类似于使用了关键字PUBLIC的外部DTD声明)。
XML名称空间
一个XML文档中可以包括许多个元素和属性,当我们使用其他人的XML文档,或者在文档中使用多个DTD文件时,就有可能碰到名称相同的元素,而这些名称相同的元素可能代表了完全不同的含义,比如:title可以用于表示标题,也可以用于表示某个人的头衔,table可以用于标示表格,也可以用于表示桌子,当这些具有相同名称的不同含义的元素混合到一个文档中时,就会造成理解和处理上的混乱。为了解决这个问题,就要用到W3C发布的另一个推荐标准——XML名称空间。
名称空间通过使用一系列的保留属性来声明,这种属性的名字必须是以xmln或以xmlns:作为前缀。与其它任何XML属性一样,这些属性可以直接或以缺省的方式给出。
名称空间的声明有两种形式。
第一种形式:
<元素名 xmlns:prefixname="URI">
元素名是指你在哪一个元素上声明名称空间,在这个元素上声明的名称空间适用于声明它的元素和属性。以及该元素内容中的所有元素及其属性。
Xmlns:prefixname作为该元素的属性名,属性的值是一个URI引用,是标示该名称空间的名称空间名字,其中prefixname给出名称空间前缀的名字。该前缀用于将元素及属性的名字与URI关联在一起。要注意的是,在这样的声明中,名称空间的名字不能为空("").如果有两个URI,其组成字符完全相同,可以认为它们标示了同一个名称空间。
来自于XML名称空间的名字可以作为限定名(qualified names)出现,限定名包含了一个以冒号(:)f分隔的名称空间前缀和一个本地部分(local part)。映射到URI引用的名称空间前缀选择了一个名称空间。
例子:<hr xmlns:hr="http://www.sunxin.org/hr"> <hr:employee>
名称空间的前缀可以是不包含冒号的任何合法的XML名称
在声明名称空间时,有两个前缀是不允许使用的,它们是xml和xmlns
第二种形式:
<元素名 xmlns="URI">
这种声明形式没有给出名称空间的前缀名,URI所标示的是缺省的名称空间。在这样的缺省声明中,属性值可以为空("")
例子: <hr xmlns="http://www.sunxin.org/hr">
表示声明了一个缺省的名称空间,hr元素及其内容中所有的没有前缀的元素都属于http://www.sunxin.org/hr所标示的名称空间,除非被hr元素内容中其他的缺省名称空间声明所覆盖。
名称空间在元素及属性中的使用
在具有很多元素(这些元素都在同一个名称空间中)的文档中,给每个元素名称都添加一个前缀是一件繁琐的事情,为此,我们可以使用没有前缀名的xmlns属性将缺省的名称空间附加给元素及其子元素,元素本身及其子元素都被认为是在缺省的名称空间中,除非他们有明确的前缀。
缺省名称空间声明中的URI可以设为空字符串,这样的话,在它的声明范围内,没有前缀的元素将被认为不存在于任何的名称空间中,这和没有声明缺省名称空间时一样的。
在XML文档中,没有任何一个标签可以包含两个相同的属性,所谓相同的有两种情况,一种是属性的名字完全相同,另一种是属性限定名种的本地部分完全相同,而不同的前缀绑定到了相同的名称空间名字。
一个属性要想在某个名称空间中,必须给该属性加上名称空间的前缀,没有前缀的属性不在任何的名称空间中(包括缺省的名称空间)。即使拥有属性的元素在某个名称空间中,没有前缀的属性仍然不在该名称空间或任何其他的名称空间中。
名称空间和DTD
DTD和名称空间并不相关,当XML处理器在验证文档的有效性时,根本不管元素前缀的含义,只是按照DTD的规范对文档进行有效性验证。
我们在声明名称空间时,使用了xmlns或xmlns:prefixname属性,而在验证时,会发现在DTD中没有声明该元素,当然验证就会失败;另外,如果在DTD中声明的是book元素,而在文档中使用的是bks:book元素,则文档也是无效的。
为了让使用名称空间的文档有效,我们必须在DTD中像声明其他属性一样声明xmlns或xmlns:prefixname属性,此外,还需要重写所有带有前缀的元素和属性的声明。
为了解决多个XML文档命名冲突的问题,可以利用W3C发布的另一个推荐标准——XML名称空间。
在声明名称空间时,选择的URL不需要指向实际的内容,在URI所标示的位置上,可以不存在任何东西,在名称空间声明中的URI,只是形式上的标示符,其唯一的目的是提供一个惟一的名称,在名称空间声明时,不能使用相对的URI,而要使用绝对的URI.
来自于XML名称空间的名字可以是作为限定名(qualified names)出现,限定名包含了一个以冒号(:)分隔的名称空间前缀和一个本地部分,要注意,没有冒号的名字也可以是限定名。
缺省名称空间声明中的URI可以设为空字符串,在声明范围内,没有前缀的元素被认为是不存在任何的名称空间中。
一个属性药想在某个名称空间中,必须给该实现加上名称空间前缀,没有前缀的属性不在任何的名称空间中,(包括缺省的名称空间)。即使拥有属性的元素在某个名称空间中,没有前缀的属性仍然不在该名称空间中或容纳后其他的名称空间中。