☆
什么是XML Top
XML 代表Extensible Markup Language(eXtensible Markup Language的缩写,意为可扩展的标记语言)。XML是一套定义语义标记的规则,这些标记将文档分成许多部件并对这些部件加以标识。它也是元标记语言,即定义了用于定义其他与特定领域有关的、语义的、结构化的标记语言的句法语言。和HTML一样,XML同样来源于SGML(Standard Generalized Markup language,即标准通用标记语言)。
☆
XML产生的背景 Top
在Web未发明之前,SGML就早已存在。正如它的名称所言,SGML是一种用标记来描述文档资料的通用语言,它包含了一系列的文档类型定义(简称DTD),DTD 中定义了标记的含义,因而 SGML 的语法是可以扩展的。SGML十分庞大,既不容易学,又不容易使用,在计算机上实现也十分困难。鉴于这些因素,Web的发明者--欧洲核子物理研究中心的研究人员根据当时(1989年)计算机技术的能力,提出了HTML语言。
HTML只使用SGML中很小一部分标记,例如HTML 3.2定义了70种标记。为了便于在计算机上实现,HTML规定的标记是固定的,即HTML语法是不可扩展的,它不需包含DTD。HTML这种固定的语法使它易学易用,在计算机上开发 HTML的浏览器也十分容易。正是由于HTML的简单性,使 Web 技术从计算机界走向全社会,走向千家万户,Web的发展如日中天。
近年来,随着 Web的应用越来越广泛和深入,人们渐渐觉得HTML不够用了,HTML过于简单的语法严重地阻碍了用它来表现复杂的形式。尽管HTML推出了一个又一个新版本,已经有了脚本、表格、帧等表达功能,但始终满足不了不断增长的需求。另一方面,这几年来计算机技术的发展也十分迅速,已经可以实现比当初发明创造HTML时复杂得多的Web浏览器,所以开发一种新的Web页面语言既是必要的,也是可能的。
有人建议直接使用SGML 作为Web语言,这固然能解决HTML遇到的困难。但是SGML太庞大了,用户学习和使用不方便尚且不说,要全面实现SGML的浏览器就非常困难,于是自然会想到仅使用SGML的子集,使新的语言既方便使用又实现容易。正是在这种形势下,Web标准化组织W3C建议使用一种精简的SGML版本--XML应运而生了。
☆
XML特点 Top
1)简洁有效,易学易用;
2)开放的国际标准;【下面几个是以XML为基础生成的数据描述语言(本文亦称为XML应用语言)的应用例子,即出版媒体:Open eBook(电子书籍)、NewsML(新闻媒体);科学:MathML(数学表达式)、CML(化学);电子商务:cXML(电子商务)、FpML(金融);多媒体:SMIL(多媒体演示)、BML(卫星数据传送) 】
3)高效且可扩展;【可以创建自己的数据类型】
4)使搜索更有意义【XML是自描述语言,能够自己体现数据的含意】;
5)作为数据交换的标准。能够实现不同平台,不同领域的数据交换;【XML是以文本形式来描述的一种文件格式 由于XML是以文本形式描述的,所以适合于各种平台环境的数据交换。同样由于使用文本来描述内容,可以越过不同平台的障碍进行正常的数据交换。但是,文本形式也会因为文字代码的不同造成不能阅读的问题,在这一点上XML有着非常完美的解决方案。】
6)数据的局部更新【当页面上局部数据需要更新的时候,服务器只需将变化的元素发送给客服端,而不需要整个内容重新发送】
7)使数据与显示分离。【XML主要是描述数据本身,而显示可以使用其他方式来体现,例如CSS,XSL等】
8)XML 文档可使用已为 HTML 建立的很多基础结构,包括 HTTP 协议和某些浏览器。HTTP 允许穿过防火墙传输 XML。
☆
良好结构的XML的规则 Top
1)文档第一步做声明。例如缺少这个声明,会引起浏览器错误理解,将XML文件误认为是默认的HTML文件,而不会调用相应的XML解析器来对文件进行解释。
<?:表示声明的开始。
xml:表示文件格式,区别于其他文件,如:HTML,VRML。
version:XML的版本信息,默认值是1.0。
standalone:是否允许文件作者使用B定义文件类型,它有两个值,"yes"和"no",表示是否需要从外部导入文件。
encoding:默认值是UTF-8(通用字符),如果要使用UTF-8以外的编码方式,在这里指定,例如国标码"GB2312"。(注意:不是所有XML软件都支持GB2312,XML标准只规定必须支持UTF-8和UTF-16两种编码,其他编码自行决定)
?>:这个符号表示声明的结束。
2)文件必须包含至少一个元素或标记。
3)每个开始标记必须和结束标记配套使用,不含数据并且仅使用一个标记的元素必须以/>结束。例如<a>link</a>或者<input ……/>。
4)文件中必须包含惟一的打开和关闭标记,即根元素。文件中的所有其他标记都必须包含在这两个标记中。
5)标记之间不能重叠,或者说是交叉定义。
6)属性值必须加引号。
☆
XML命名规则 Top
<!--
XML名以下划线或字母开始;
XML名可包含字母、数字、句点、下划线和冒号;
XML名不能包含空格;
XML名不能以数字开始,但可包含数字;
XML名区分大小写。
-->
☆
XML文档中需要转义的字符 Top
小于号<【<】
大于号>【>】
符号&【&】
单引号'【'】
双引号"【"】
☆
XML文档的组成 Top
XML声明:<?xml version="1.0" standalone="yes"?>
根元素:每篇XML文档有且只能有一个根元素。由元素是文档的第一个元素,包含其它所有元素。
CDATA部分:它用<![CDATA[和]]>表示,它们之间的数据作为原始字符显示,唯一不能出现的标志是]]>。
注释:以<!--开头-->结尾的一对区间。在以-->结束之前,不能出现"--"号。
处理指令:处理指令以<?开头以?>结尾。如PHP处理指令可写成,<?php ?>。处理指令是标记,而不是元素。因此,与注释一样,处理指令可出现在XML文档的标签外的任何位置,包括根元素之前或之后。最常见的处理指令是,xml-stylesheet样式表指令,它会告诉浏览器在显示文档时应用什么样式表。如:<?xml-stylesheet href="sample.css" type="text/css"?><portal><name></name></portal>
☆
CDATA与XML注释 Top
CDATA
在CDATA内部的所有内容都会被解析器忽略,即所有的标记、实体引用都被忽略,而被XML处理程序一视同仁地当作字符数据看待。
1)一个 CDATA 部件以"<![CDATA[" 标记开始,以"]]>"标记结束:
2)CDATA部件之间不能再包含CDATA部件(不能嵌套)。
3)CDATA内部不能包含字符"]]>" 和"<![CDATA[" ,在字符串"]]>"之间没有空格或者换行符。
例1:忽略实体
<?xml version="1.0" encoding="gb2312" ?>
<root>
<student>
<![CDATA[
<name>woxingwosu</name>
<sex>man</sex>
]]>
</student>
</root>
上面的name和sex不作为节点处理,而是当作字符数据。
例2:忽略标记
<?xml version="1.0" encoding="gb2312" ?>
<root>
<student>
<![CDATA[
You Can Enter < > As Data.
]]>
</student>
</root>
上面CDATA中的特殊符号不需要转换
注释
和HTML一样,注释用"<!--"和"-->"引起来的。
不过,在XML文件中使用注释时,同样要遵守几个规则:
1)在注释文本中不能出现字符"-"或字符串"--"。
2)不要把注释文本放在标记之中。类似地,不要把注释文本放在实体声明中,也不要放在XML声明之前。
3)注释不能被嵌套。
例如:
<?xml version="1.0" encoding="gb2312" ?>
<root>
<!-- This is a test -->
<student>hello</student>
</root>
☆
XML与HTML Top
XML与HTML的关系
1)XML 不是要替换 HTML,实际上 XML 可以视作对 HTML 的补充。XML 和 HTML 的目标不同:HTML 的设计目标是显示数据并集中于数据外观,而 XML 的设计目标是描述数据并集中于数据的内容。
2)与 HTML 相似,XML 不进行任何操作。虽然 XML 标记可用于描述订单之类的项的结构,但它不包含可用于发送或处理该订单以及确保按该订单交货的任何代码。其他人必须编写代码来实际对 XML 格式的数据执行这些操作。
3)与 HTML 不同,XML 标记由架构或文档的作者定义,并且是无限制的。HTML 标记则是预定义的;HTML 作者只能使用当前 HTML 标准所支持的标记。
XML与HTML语法上的区别
1)大小写有所区分;
2)要有正确的结束标记;
3)标记要正确嵌套;
3)有效使用属性;在HTML中,可以拥有不带值的属性名。在XML中,所有的属性都必须带有相应的值。
4)标记中可以包含任意多个属性。在标记中,属性以名称/取值对出现,属性名不能重复,名称与取值之间用等号"="分隔,且取值用引号引起来。
☆
使用DTD校验文件的四种方式 Top
1)在文档内部使用
<!DOCTYPE 根元素名称 [<!ELEMENT 元素 ……>]>
<?xml version="1.0" standalone="no"?>
<!DOCTYPE portal [<!ELEMENT root (name,reg*)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT reg (#PCDATA)>]>
<root>
<name>woxingwosu</name>
<reg>china</reg>
<reg>US</reg>
</root>
2)使用本机的DTD文件校验:
<!DOCTYPE 根元素名称 SYSTEM "DTD文件的URI">,SYSTEM 表示文档使用的是私有DTD文件,URI可以为相对路径或绝对路径。
root.dtd
<!ELEMENT root (name,reg*)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT reg (#PCDATA)>
root.xml
<?xml version="1.0" standalone="no"?>
<!DOCTYPE root SYSTEM "root.dtd">
<root>
<name>woxingwosu</name>
<reg>china</reg>
<reg>US</reg>
</root>
3)使用外部的DTD校验:
<!DOCTYPE 根元素名称 PUBLIC "DTD名称" "外部DTD文件的URI">
PUBLIC关键字用于声明公共DTD,DTD名称也称为公共标识符(public identifier)。这种DTD可以存在在一个公共的地方,xml处理程序会根据名称按照某种方式去检索DTD,如果xml处理程序不能根据名称检索到DTD,就会按照外部DTD的URI来查找DTD。
DTD名称和xml名称略有不同,它只可以包含ascII字母和数字、空格、回车符、换行符和一些标点符号:-'()+,./:=?;!*#@$_% 。且公共DTD的名称需遵守一些约束。
如果一项DTD是ISO标准,它的名称要以字符串"ISO"开始;
如果是一个非ISO的标准组织,则以加号(+)开始;
如果不是标准组织批准的DTD,它的名称以连字符(-)开始。之后是 //DTD所有者的名称//DTD的描述信息//语言标识符。
例如用DW建立一个HTML文件的开头就有:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">还有strus1的配置文件也有:<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
可以根据后面的URI地址把DTD文件下载下来看,可以深入了解文档的结构。
4)同时在文档内部和DTD来校验
我们可以结合内外dtd,共同组成一个dtd来为XML文档作验证。
root.dtd
<!ELEMENT root (name,reg*)>
root.xml
<?xml version="1.0" standalone="no"?>
<!DOCTYPE portal SYSTEM "root.dtd" [<!ELEMENT name (#PCDATA)>
<!ELEMENT reg (#PCDATA)>]>
<root>
<name>woxingwosu</name>
<reg>china</reg>
<reg>US</reg>
</root>
注意,使用内外dtd时,这两个dtd要互相兼容,不能有冲突。
☆
DTD语法规则 Top
一个完全意义上的XML文档不仅仅是“格式良好的”,而且还应该是使用了一些自定义标记的“有效的”XML文档,也就是说,它必须遵守文档类型定义中已声明的规则。XML是在SGML基础上发展起来的,而SGML是用DTD来定义数据的格式和规则。
文档类型定义DTD(Document Type Definition)描述了一个语言的语法和词汇表,也就是定义了文档的整体结构以及文档的语法。简而言之,DTD规定了一个语法分析器以解释一个“有效的”XML文档所需要知道的所有规则的细节。
一个DTD可以是内部的,包含在XML文档的前导说明部分;也可以是外部的,作为一个外部文档被引用。
一个包含内部DTD的XML文档的结构为:
内部DTD是在XML文件的文件序言区域中定义的。主要由两部分组成,结构部分和元素部分。
1)结构语法: <!DOCTYPE element-name[……]>
<!DOCTYPE:表示开始设定DTD
Element-name:指定此DTD的根元素的名称,一个XML文件只能有一个根元素。注意,如果 XML文件使用了DTD,那么文件中的根元素就在这里指定。
[]> :在[ ]标记里面定义XML文件
2)元素语法:<!ELEMENT element-name element-definition>
<!ELEMENT:表示开始元素设置
element-name:表示要设置的元素的名称。
element-definition:指明要对此元素进行怎样的定义,就是说〈元素〉〈/元素〉之间能够包含什么内容,是其他元素还是一般性的文字。
例如:
<?xml version="1.0" encoding="GB2312" standalone="yes"?>
<!DOCTYPE student [name,sex]>
<!ELEMENT name (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
3)元素声明
#PCDATA:规定元素只包含已析的字符数据。
例如:<!ELEMENT name (#PCDATA)>表示name元素是一个文本节点(叶子节点)。
子元素:可指明元素的子元素。
例如:<!ELEMENT name (sonname)>表示name元素必须包含且只包含一个sonname元素。
也可用逗号为分隔符,指明多个子元素。并且子元素出现的次序必须按定义时的顺序。
例如:<!ELEMENT name (name1,name2)>表示name元素包含且必须包含子元素name1和name2,且name1在name2之前。
子元素的个数:(和正则表达式中的含意一样)
?:零个或一个该元素
*:零个或多个该元素
+:一个或多个该元素
例如:<!ELEMENT name (name1,name2?)>表示name元素必须包含name1子元素,可以不包含或者只包含一个name2元素。
可选项|:选项是一个参数列表,每个参数间用"|"分隔,代表能且只能选一个子元素,就是或者的意思。
例如:<!ELEMENT sex (man | women)>表示sex元素要么包含man子元素,否则必须包含women子元素。
小括号:小括号可以实现一个小的团体,以实现更复杂的结构。
例如:<!ELEMENT name (#PCDATA | student | teacher )* >。
空元素:不包含任何内容的元素,称之为空元素,写成以/>结束的独立标签,就如HTML中的<br/>。
<!ELEMENT name EMPTY>表示元素name没有任何内容。
ANY:允许元素内包含任意内容。该选项在dtd测试时很有用,在实际运用中尽量不要使用。
例如:<!ELEMENT name ANY>
4)属性类型
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类型:属性包含枚举类型中的一个,直接列举所有的值,中间用竖线分隔。如:<!ATTLIST date month(January | February | March | April | May | June | July | August | September | October | November | December) #REQUIRED>针对上述声明,date元素的month属性可选十二个月份的中一个。
ATTLIST声明除了要提供一种数据类型外,还要声明属性的缺省行为。
#IMPLIED,属性可选。
#REQUIRED,属性必须有。
#FIXED,属性是常量,不能更改。<!ATTLIST checkbox checked CDATA #FIXED "checked">表示checkbox元素的checked属性必须是"checked"
Literal,作为一个引用字符串的实际缺省值。<!ATTLIST company name NMTOKEN "com.cn">如果没有显示指明company 元素的name属性,则该值为"com.cn"。
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>
对应的声明如下:
<!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 project project_id ID #REQUIRED team IDREFS #REQUIRED>
<!ATTLIST person card_id ID #REQUIRED>
对应的文档可写成:
<project project_id="p1" team="c123 c456">
<gold>deploy linux</gold>
</project>
<person card_id="c123">
<name>Linuxsir</name>
</person>
<person card_id="c456">
<name>Linuxsir</name>
</person>
ENTITY类型:属性包含在DTD的其它位置声明的未析实体的名称中。如movie元素可能有一个标识激活时播放mpeg或rm文件的实体属性:<!ATTLIST movie src ENTITY #REQUIRED>如果DTD声明了一个名为play的未析实体,则此movie元素可用于在XML文档中嵌入视频文件:<movie src="play" />
ENTITY翻译为"实体",如果学过C的宏定义就很容易理解。使用ENTITY的好处在于:1)它可以减少差错,文档中多个相同的部分只需要输入一遍就可以了。2)它提高维护效率。比如你有40个文档都包含copyright的ENTITY,如果需要修改这个copyright,不需要所有的文件都修改,只要改最初定义的ENTITY语句就可以了。实体分为两种:普通实体和参数实体。
普通实体
例如:定义版权<!ENTITY copyright "mycompany.com">这样可以用©right;引用字符串"mycompany.com"。
引用外部XML文档<!ENTITY newxml SYSTEM "/home/linux/myxml.xml">这样可以使用&newxml;引用/home/linux/myxml.xml文档。但是如果引用的类型不是XML能识别(不是文本字符)的,如jpeg照片,mpeg电影等。XML建议使用外部未析实体作为在文档中嵌入这些内容的机制。DTD为包含非XML数据的实体指定一个名称和URI。例如<!ENTITY Logo SYSTEM "Logo.gif" NDATA gif><!NOTATION gif SYSTEM "image/gif">avi是在NOTATION中定义的MIME媒体类型。在XML中嵌入未析实体很复杂且不规范,尽量不要使用。
参数实体:可定义一组通用的实体,在文档中可通过该参数实体来引用实体。参数实体的定义与通用实体定义类似,只是中间多了一个%,引用时也是用%代码;。
例如:<!ENTITY % imgParam "width CDATE #FIXED '100px' height CDATA #IMPLIED"><!ATTLIST img %imgParam;>就等价于<!ATTLIST img width CDATE #FIXED '100px' height CDATA #IMPLIED>
注释声明
使用IGNORE关键字可注释声明,如:<![IGNORE[ <!ELEMENT note (#PCDATA)>]]>等价于<!-- <!ELEMENT note (#PCDATA)> -->。
使用申明
INCLUDE关键字表示DTD中使用给定的声明,如:<![INCLUDE[ <!ELEMENT note (#PCDATA)>]]>等价于<!ELEMENT note (#PCDATA)>。有没有使用INCLUDE效果都一样,但如果组合INCLUDE和IGNORE,可实现DTD功能的选择。<!ENTITY % note_allowed "INCLUDE" ><![%note_allowed;[ <!ELEMENT note (#PCDATA)>]]>这样元素声明是有效的,把参数实体%note_allowed重新定义为IGNORE,这样,该元素声明就无效。
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作为允许值。
这十种类型,又可分为三个大类。第一大类是字符串类型,指的是CDATA,它的值可以是任何合法的字符串。第二大类是枚举类型,包括ATTLIST和NOTATION,需要在DTD中为它们声明可取值的列表。剩下的七种类型都属于第三大类,又称为记法类型,含有不同的词法及语意限定。
☆
参考资料
XML认证教程,第 1 部分: XML简介
http://www.ibm.com/developerworks/cn/xml/x-cert/part1/index.html
XML及相关技术认证系列
http://bbs.itren.cn/html/bbs25730.
XML 标准概览: 第 1 部分
http://www.ibm.com/developerworks/cn/xml/x-stand1/
XM语法大全
http://blog.csdn.net/cyzhang1983/archive/2007/07/20/1699784.aspx
posted on 2007-08-31 21:57
破茧而出 阅读(1702)
评论(0) 编辑 收藏 所属分类:
XML