1. XML文档包含三个部分
XML文档包含以下三个部分:
① 一个XML文档声明。
② 一个关于文档类型的定义。
③ 用XML标记创建的内容。
下面以myfile.xml为例进行说明。
<?xml version="1.0" encoding="GB2312"?>
<!DOCTYPE myfile SYSTEM "myfile.dtd">
<myfile>
<title>XML轻松学习手册</title>
<author>ajie</author>
<email>ajie@aolhoo.com</email>
<date>20010115</date>
</myfile>
其中,第一行<?xml version="1.0"?>就是一个XML文档的声明,第二行说明这个文档是用myfile.dtd来定义文档类型的,第三行以下的语句就是内容主体部分。
2. XML文档术语
① 标记(Tag):用来定义元素名称和属性名称。在XML中,标记必须成对出现,将数据包围在中间。
② 元素(Element):由元素名称和元素内容组成。一个元素由一个标记来定义,包括开始和结束标识以及其中的内容。
③ 属性(Attribute):由属性名称和属性内容组成。属性是对元素进一步描述和说明,一个元素可以有多个属性。属性是一种为元素加入描述性信息的机制。
④ 元素的包含关系:元素(属性,子元素(属性,子元素))。
⑤ 空元素:没有内容的元素。书写格式为<Element></Element>或<Element/>。
⑥ 声明(Declaration):在所有XML文档的第一行都有一个XML声明。这个声明表示这个文档是一个XML文档,它表示遵循的是哪一个XML规范的版本。
⑦ DTD(文件类型定义):DTD是用来定义XML文档中元素、属性以及元素之间的关系。通过DTD文件可以检测XML文档结构是否正确,但建立XML文档并不一定需要DTD文件。
⑧ Well-formed XML(良好格式的XML):一个遵守XML语法规则,并遵守XML规范的文档称之为“良好格式”。
⑨ Valid XML(有效格式的XML):一个遵守XML语法规则,并遵守相应DTD文件规范的XML文档称为有效的XML文档。
⑩ XML文档举例说明。
<?xml version="1.0" standalone="yes" encoding="UTF-8"?>
<author sex="female">ajie</author>
上述XML文件中元素标记(即元素名称)为author,属性标记(即属性名称)为sex。元素author内容为ajie,该元素author的sex属性内容为female。第一行是XML声明。
3. 属性与子元素的比较
属性也可以改成子元素,改成子元素后易于扩充和编程,但减少了可读性。
下面两个文件中,第一个包含sex属性,第二个把属性sex改成了子元素。
<person sex="female"> <firstname>Anna</firstname> <lastname>Smith</lastname> </person> |
<person> <sex>female</sex> <firstname>Anna</firstname> <lastname>Smith</lastname> </person> |
属性的缺点有:属性不能包含多个值,子元素可以;属性不容易扩展,属性不能够描述结构,子元素可以;属性值很难通过DTD进行测试。
属性的优点是增加了文件的可读性,程序处理耗费的内存空间和时间比子元素少。
数据既可以存储在子元素中也可以存储在属性中。元数据(与数据有关的数据)应该以属性的方式存储,而数据本身应该以元素的形式存储。
4. XML文档的语法规则
XML文档的语法规则如下:
必须有XML声明语句。声明语句是文件的第一句,格式为<?xml version="1.0" standalone="yes/no" encoding="UTF-8"?>。声明的作用是告诉浏览器或者其他处理程序这个文档是XML文档。声明语句中的version表示文档遵守XML规范的版本,standalone表示文档是否附带DTD文件,encoding表示文档所用的语言编码,默认是UTF-8。
在XML文档中,所有的标记必须要有结束标记,包括空标记。
所有的XML文档必须有一个根元素,XML文档中的第一个元素就是根元素。
所有的XML文档都必须包含一个单独的标记来定义,所有的其他元素都必须成对在根元素中嵌套。XML文档有且只有一个根元素。所有的XML标记都必须嵌套合理。
属性值必须使用引号(包括双引号和单引号)。在XML中,元素的属性值没有引号引着是不符合规定的。
使用XML,空白将被保留。在XML文档中,空白部分不会被解析器自动删除。
使用XML,CR/LF被转换为LF。使用XML,新行总是被标识为LF(Line Feed,即换行)。
在XML中注释的语法基本上和HTML中的一样,如<!-- 这是一个注释 --> 。
XML标记都是大小写敏感的。
XML文档使用了自描述和简单的语法。
5. XML元素的语法
XML元素的语法规则如下:
① XML元素是可以扩展的,它们之间有关联。
② XML元素有简单的命名规则。
③ XML元素是可以扩展的,XML元素的可扩展决定了XML文档的可扩展。
④ XML元素是相互关联的,XML元素之间可以是父子关系和兄弟关系。
⑤ XML元素由元素名称和元素内容组成。XML元素可以有不同的内容。
⑥ 元素可以用来标记XML文件中的区段。XML元素拥有下列的格式:
<ElementName>Content</ElementName>
内容Content部分将会被包含在XML标记中。
⑦ 虽然XML标记通常包围住内容部分,但是也可以建立不含内容的元素,称为空(empty elements)元素。在XML中,空元素可以利用下面两种方式来呈现:
<ElementName/>
<ElementName></ElementName>
6. XML元素命名规则
XML元素的语法规则如下:
① 元素的名字可以包含字母、数字和其他字符。
② 元素的名字只能以字母和“_” (下画线)开头。
③ 元素的名字不能以XML(或者xml、Xml、xMl…)开头。
④ 元素的名字不能包含空格,中间不能包含“:”(冒号)。
7. 属性的语法
XML属性的语法规则如下:
① XML元素在开始标记处可以有元素属性。
② XML元素可以有属性,属性通常包含一些关于元素的额外信息。
③ 属性值必须用引号引着(单引号、双引号都可以使用,单引号中可以包含双引号)。
④ 通常可以用子元素代替属性。
⑤ XML属性定义格式如下:
<person sex="female">why</person>
代码中person是元素名称,sex是属性名称。
8. 注释的语法
XML注释的语法格式如下:
<!-- 这里是注释信息 -->
9. 转义字符
不合法的XML字符必须替换为相应的实体然后才可以使用。
如果在XML文档中使用类似“<”的字符, 那么解析器将会出现错误,因为解析器会认为这是一个新元素的开始。所以不应该像下面这样书写代码:
<message>if salary < 1000 then</message>
为了避免出现这种情况,必须将字符“<”转换成实体,改写方法如下:
<message>if salary < 1000 then</message>
下表19-1是五个在XML文档中预定义好的实体。实体必须以符号“&”开头,以符号“;”结尾。注意只有“<”字符和“&”字符对于XML来说是严格禁止使用的。剩下的都是合法的,为了减少出错,使用实体是一个好习惯。
表19-1 XML预定义实体表
实体 | 符号 | 含义 |
< | < | 小于号 |
> | > | 大于号 |
& | & | 和 |
' | ' | 单引号 |
" | " | 双引号 |
10. CDATA的语法
CDATA全称character data,翻译为字符数据。在标记CDATA下,所有的标记、实体引用都被忽略,而被XML处理程序一视同仁地当做字符数据看待。CDATA语法格式如下:
<![CDATA[这里放置需要显示的字符]]>
例如<![CDATA[<AUTHOR sex="female">ajie</AUTHOR>]]>在页面上显示的内容为“<AUTHOR sex="female">ajie</AUTHOR>”。
对CDATA的两点说明如下:
在XML文档中的所有文本都会被解析器解析,只有在CDATA部件之内的文本会被解析器忽略。
CDATA部件之间不能再包含CDATA部件(不能嵌套)。
11. Namespaces的语法
Namespaces翻译为命名空间。命名空间有什么作用呢?当在一个XML文档中使用多个DTD文件时,就会出现这样的矛盾:因为XML中标识都是自己创建的,在不同的DTD文件中,标识名可能相同但表示的含义不同,这就可能引起数据混乱。
命名空间说明标记属于哪一空间,避免相同命名引起的混乱问题。
Namespaces通过给标识名称加一个网址(URL)定位的方法来区别这些名称相同的标识。Namespaces同样需要在XML文档的开头部分进行声明。
下面例子命名空间是h,解析时用http://www.w3.org/TR/html4网址的DTD文件解析。
<h:table xmlns:h="http://www.w3.org/TR/html4/">
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
12. entity的语法
entity翻译为“实体”。实体把文档中共同部分抽象出来,达到一次定义多次引用的目的。可以预先定义一个entity,然后在一个文档中多次调用。
使用entity的好处有下面两点:
① 它可以减少差错,文档中多个相同的部分只需要输入一遍就可以了。
② 它提高了维护效率。
XML定义了两种类型的entity。一种是普通entity,在XML文档中使用;另一种是参数entity,在DTD文件中使用。
entity的定义语法为:
<!DOCTYPE filename [
<!ENTITY entity-name "entity-content"
]
>
定义好的entity在文档中的引用语法为:
&entity-name;
下文copyright.xml中定义了copyright实体并加以引用,其文件内容如下:
<?xml version="1.0" encoding="GB2312"?>
<!DOCTYPE copyright [
<!ENTITY copyright "Copyright 2001, Ajie. All rights reserved">
]>
<myfile>
<title>XML</title>
<author>ajie</author>
<email>ajie@aolhoo.com</email>
<date>20010115</date>
©right;
</myfile>
13. XML的结构化
XML促使文档结构化,所有的信息按某种关系排列。结构化就是为文档建立树形框架,使每一部分都紧密联系,形成一个整体。结构化有如下两个原则:
① 每一部分(每一个元素)都和其他元素有关联,关联的级数就形成了结构。
② 标识本身的含义与它描述的信息相分离。
14. XML的确认
符合语法的XML文档称为结构良好的XML文档,一个结构良好的XML文档应该使用正确的语法。
通过DTD验证的XML文档称为有效的XML文档,一个有效的XML文档应该遵守DTD的描述。
XML DTD定义了XML文档中可用的合法元素。
XML Schema(XML模式)是基于XML的DTD替代品,W3C使得DTD和Schema可以相互替代。
XML文档中发生错误将导致XML程序停止,所以语法正确时XML文档才能解析完成,即此文档是有效的XML文档。
15. DTD语法
DTD是“有效XML文档”的必须文件,通过DTD文件来定义文档中元素和标识的规则及相互关系。
(1)设置元素
元素是XML文档的基本组成部分,使用时需在DTD中定义一个元素,然后在XML文档中使用。元素在DTD中定义的语法格式为:
<!ELEMENT DESCRIPTION (#PCDATA, DEFINITION)*>
其中“<!ELEMENT” 是元素的声明,说明要定义的是一个元素,声明后面的“DESCRIPTION”是元素的名称,“(#PCDATA, DEFINITION)*>”则是该元素的使用规则。
(2)DTD元素定义规则表
下表19-2概要列出了DTD中元素定义的规则,DTD中定义的规则说明了元素可以包含的内容以及相互的关系。
表19-2 DTD中元素定义规则表
符号 | 含义 | 举例 |
#PCDATA | 包含字符或文本数据 | <MYFILE(#PCDATA)> 元素MYFILE包含一个文本数据 |
#PCDATA, element-name | 包含文本和其他子元素 | <MYFILE(#PCDTATA,TITLE)>MYFILE元素必须包含文本和TITLE子元素 |
, | 使用逗号分隔排序 | <MYFILE (TITLE,AUTHOR,EMAIL)> MYFILE元素必须依次包含TITILE,AUTHOR,EMAIL三个子元素 |
| | 使用"|"表示或者 | <MYFILE (TITLE | AUTHOR | EMAIL)> MYFILE元素必须包含TITLE,或者AUTHOR或者EMAIL子元素 |
name | 只能使用一次 | <MYFILE (TITLE)> MYFILE元素必须包含TITLE子元素,而且只能使用一次 |
name? | 使用一次或者不使用 | <MYFILE (TITLE,AUTHOR?,EMAIL?)> MYFILE元素必须包含TITLE子元素,而且只能使用一次;可以包含或者不包含AUTHOR和EMAIL子元素,但是如果使用,只能一次 |
name+ | 使用至少一次或多次 | <MYFILE (TITLE+,AUTHOR?,EMAIL)> MYFILE元素必须包含TITLE子元素,而且使用至少一次;接下来可以跟随AUTHOR子元素,也可以不跟;最后必须包含EMAIL子元素,而且只能使用一次 |
name* | 使用一次,多次,或者根本不使用 | <MYFILE (TITLE*)>MYFILE元素可以包含一个,多个或者不包含TITLE子元素 |
( ) | 设置组,可以嵌套 | <MYFILE(#PCDATA | TITLE)*>元素MYFILE包含一个或者更多的文本或者TITLE子元素。 <MYFILE((TITLE*, AUTHOR?, EMAIL)* | COMMENT)> MYFILE元素必须包含一些内容,内容或者是一个注释;也或者是多个组,组里包含:一个,多个或者没有TITLE子元素,接着是一个或者没有AUTHOR子元素,再接着是一个必须的EMAIL子元素 |
(3)DTD定义举例说明
下面建立myfile.xml文件,然后在myfile.dtd中定义此文件的元素规则。
建立myfile.xml文件,文件内容如下:
<?xml version="1.0" encoding="GB2312"?>
<!DOCTYPE myfile SYSTEM "myfile.dtd">
<myfile>
<title>XML轻松学习手册</title>
<author>ajie</author>
</myfile>
建立myfile.dtd文件,文件内容如下:
<!ELEMENT myfile (title, author)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
16. XML编码
对XML编码的建议如下:
① 使用一种支持Unicode编码格式的编辑器。
② 确信知道自己正在使用哪种编码格式。
③ 在XML文档中使用属性声明设置编码格式。
④ XML文档说明要以<?开始,以?>结束。
⑤ XML文档编码定义格式如下:
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="gb2312"?>
17. DOM树
DOM(Document Object Model,即文档对象模型)树是将XML文件或XML字符串在内存建立文档对象树,方便XML节点增删改查操作。
使用XML时,一般需要首先将XML文档读入内存形成DOM树,使之结构化,以便进一步操作。下图19-2画出了DOM树的节点种类及其层次关系,树中的每个 Document、Element、Text和Attr都是DOM节点。
图19-2 DOM树层次图
使用DOM的基本规则为:不要使用DOM来遍历文档。只要可能,就使用XPath来查找节点或遍历文档。使用高级函数库使DOM更易于使用。
下面以bookstore.xml文件来说明DOM树,此文件内容如下:
<bookstore>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
</bookstore>
bookstore.xml文件中的根元素是bookstore,文档中的book元素都被包含在bookstore中,book元素有4个子元素,分别为title、 author、year、price。bookstore.xml形成DOM树如下图19-3所示。
图19-3 DOM树实例图
18. XML术语
① XHTML - 可扩展HTML(Extensible HTML)
② XSL - 可扩展样式表语言(Extensible Style Sheet Language)
XSL由三部分组成: XML文档转换(XML Document Transformation ,又叫XSLT)、模式匹配语法(XPath)、格式化对象(XSL FO)。
③ XSLT - XML转换语言(XML Transformation)
XSLT是一种比CSS功能更强的语言,它可将XML文档转换成其他格式的文档。
④ XPath - XML匹配模式(XML Pattern Matching)
XPath是一种用于标识XML文档各个部分的语言,这是一种为了XSLT和 XPointer而设计出来的语言。
⑤ XPointer - XML指针语言(XML Pointer Language)
XML指针语言(The XML Pointer Language,XPointer),标识XML文档的内部结构,例如元素、属性、内容等。
⑥ XLink - XML链接语言(XML Linking Language)
链接语言(The XML Linking Language,XLink),允许在不同的XML资源之间建立链接关系。
⑦ DTD - 文档类型定义 (Document Type Definition)
DTD主要用于定义编写XML文档所使用的元素。
⑧ Namespaces - 命名空间
XML命名空间提供一种可以把元素、属性、命名和URL地址引用相互关联的方法。
⑨ DOM - 文档对象模型(Document Object Model)
DOM定义了XML文档的接口、属性和方法。
⑩ SAX - XML的简单API(Simple API for XML)
SAX是另一种读取和操作XML文档的编程接口(与DOM类似)。
⑪ Schema-中文称模式
与DTD不同,它本身也是基于XML。XML Schema同时还支持名称空间,能够定义比DTD更复杂的数据类型和结构。XML Schema内置支持一系列的简单数据类型,如字符串、小数和整数等,还可以定义元素出现的次数。因此XML Schema更适合以数据为中心的文档。
摘录自《深入浅出Linux工具与编程》