(本系列文章是我学习的过程中,整理出来的笔记,如有错漏,看官请一定不吝回复,让我能认识自己的不足,并改进错误。非常感谢!)

推荐一个XML编辑工具,强大的XMLSpy,我用的是2008版。

    XML文档的结构可以从物理和逻辑两方面来看。
    一、从物理上而言,文档由称为实体(entities)的存储单元组成,实体都是具有内容并且都通过实体的名字进行标识(文档实体和外部DTD子集除外)。实体可以是一段文本,一个文件,一个数据库记录或者其他包含数据的项目,一个实体可以引用其它的实体,从而将它们包含在文档中。文档开始于“根(root)”或者文档实体(document entity)。格式良好的XML文档形成了一种层次树结构,这个树结构的树根就是文档实体,与其它实体不同,文档实体没有名字,只是用于表示文档树的根。XML文档的根元素被称位文档元素(document element),它和在其外部出现的处理指令,注释等作为文档实体的子节点,而根元素本身和其内部的子元素也是一棵树。

    实体可以包含已分析(parsed)的或未分析的(unparsed)数据。已分析的数据由字符组成,其中一些字符组成字符数据,另一些字符组成标记。已分析的实体(parsed entity)内容被成为它的代替文本,这个文本被看称是文档整体的一部分,在XML处理器分析XML文档时,凡是文档中出现引用已分析实体的地方,都将被该实体的内容所替换。未分析的实体(unparsed entity)是一种资源,它的内容可以是也可以不是文本,并且,如果是文本的话,可以不是XML文本,每一个未分析的实体有一个相关联的用名字标识的记号(notation)。除了要求XML处理器能向应用程序提供可用的实体和记号的标志符之外,XML对未分析的的实体内容不做任何限制。已分析的实体以实体引用的方式通过名字来调用,未分析的实体通过ENTITY或ENTITIES属性中给出的名字来调用。

    二、逻辑上而言,文档由声明,元素,注释,字符引用和处理指令组成,在文档中,所有这些都是通过显式的标记(markup)来指明的。XML标记(markup)包括开始标签(tag)、结束标签、空元素标签、实体引用、字符引用、注释、CDATA段定界符、文档类型声明、处理指令、XML声明、文本声明以及任何在文档实体顶层的空白(即,在文档元素之外,且不在任何其它的标记内部)。
其它所有非标记的文本组成文档的字符数据。
    XML文档在逻辑上主要由以下五个部分组成:
    1、XML声明
    2、文档类型声明
    3、元素
    4、注释
    5、处理指令

下面具体介绍XML文档逻辑上的五个部分。

1、XML声明
XML文档总是以一个XML声明开始的,其格式如下
    <?xml 版本信息 [编码信息] [文档独立性信息]?>
其中,编码信息和文档独立性信息可以不写,而使用默认值。

需要注意的是,XML声明总是在XML文档的最前面,其前面不能出现任何字符。

下面是几个例子:

<?xml version="1.0"?>
<!--版本信息声明-->

<?xml version="1.0" encoding="ISO-8859-1"?>
<!--编码信息声明.默认值是"UTF-8"-->

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!--文档独立性信息声明,如果文档依赖于外部文档,则需要将standalone属性设置为"no"-->


2、文档类型声明

DTD(Document Type Definition),文档类型定义。

首先提一个问题,如果你的一个XML文档给别人使用,别人怎么才能正确地定义XML文档中的元素,属性呢?就好像我们用Struts时,我们需要配置struts-config.xml,但是怎么保证我们的配置是正确的?答案就是用DTD来验证。

一个遵循XML语法规则,并遵守相应DTD文件约束的XML文档称为有效的XML文档

XML从SGML继承了用于定义语法规则的DTD机制,DTD文件本身是不需要遵循XML规则的。大部分的XML应用都是使用DTD来定义的(还有一部分是用XML Schema来定义的,XML Schema在其专题中学习)。HTML就有一个标准的DTD文件,所以其组织结构和所有的标签都是固定的,DTD文件本身也是一个文本文件,通常用".DTD"为其扩展名。

文档类型声明的作用就是指出XML文档所用的DTD,文档类型声明有两种形式。

一种是在XML文档中给出DTD,如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE OrganizationChart [
    <!ELEMENT OrganizationChart (Name,Office)
>
    
<!ELEMENT Name (#PCDATA)>
    
<!ELEMENT Office (#PCDATA)>
    ]>

<OrganizationChart>
<!--OrganizationChart是该XML文档的document element-->
    <Name>Toone,INC.</Name>
    
<Office>zhuhai</Office>
    <!--因为DTD中定义了Name,Office两个元素的顺序,Office元素不能放在Name元素的前面,否则不是有效的XML文档-->
</OrganizationChart>

另一种是在一个外部文件定义的DTD文件,如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE OrganizationChart SYSTEM "dtdTest.dtd" >
<OrganizationChart>
    
<Name>Toone,INC.</Name>
    
<Office>zhuhai</Office>
</OrganizationChart>
对应DTD文件dtdTest.dtd内容为:
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT OrganizationChart (Name,Office)>
<!ELEMENT Name (#PCDATA)>
<!ELEMENT Office (#PCDATA)>


3、元素

在XML中,元素由开始标签、元素内容和结束标签构成,对于空元素,由空元素标签构成。
每一个元素都有一个用名字标识的类型,同时它可以由一个属性说明集,每一个属性说明有一个名字和一个值。
在给元素命名的时候要注意,以"xml"或其他任何匹配(('X'|'x')
 
('M'|'m' )('L'|'l' ))的字符串开头的名字,被保留用于XML规范的当前版本或者后续版本的标准化。此外,在给元素命名时,还要遵循下列规范:
    1、名字只能以字母、下划线(_)或者冒号(:)开头;
    2、名字中可以包含字母、数字、下划线以及其他在XML标准中允许的字符;
    3、名字中不能包含空格;
    4、名字中尽可能不要使用冒号(:),因为冒号在名字空间中被用于分隔名字空间前缀和本地部分。

元素的四种形式:
    1、空元素
    2、带有属性的空元素
    3、带有内容的元素
    4、带有内容和属性的元素

在一个元素的内容中,字符数据可以是不包含任何标记的起始定界符和CDATA段的定界符的任意字符串,也就是会所在元素的内容中,字符数据不能有和号(&)和小于号(
<),也不能有字符串"]]>"。那么如果我们要用这些字符的话,必须用他们对应的字符引用和实体引用来表示,见下表:

 元素内容的字符引用和实体引用
 字符  字符引用
(十进制代码)
 字符引用
(十六进制代码)
预定义实体引用 
 < <
<
&lt;
>
>
>
&gt;
"


&quot;
'


&apos;
&


&amp;

CDATA段中包含的都是纯字符数据,在字符数据可以出现的任何地方都可以使用CDATA段。
CDATA段主要用于需要将整个文本解释为字符数据而不是标记的情况下。CDATA段中的内容不被XML处理器分析,所以可以在其中包含任意的字符。


4、注释

注释用于对文档中的内容起到一个说明作用。
在XML文档中,注释可以出现在文档中其它表ijizhiwai的任何闻之,另外,它们还可以在人当类型声明中语法(grammar)允许的地方出现。
XML的注释和HTML的注释类似,都是以<!--开始,以-->结束。位于<!--和-->之间的数据将被XML处理器忽略。
使用XML注释需要注意一下五点:
    1、注释不能出现在XML声明之前,XML声明必须是文档最前面的部分。下面的情况是不允许的:
<!--Author:Jason Chen-->
<?xml version="1.0"?>

    2、注释不能出现在标记中,下面的例子是非法的:
<author<!--This document author-->>Jason Chen</author>

    3、注释可以包围和隐藏标记,但是要注意,在注释掉标记以后,要保持文档的完整结构。
    4、字符串"--"(双连字符)不能出现在注释中。

5、处理指令

处理指令(Processing Instructions)允许文档中包含由应用程序来处理的指令。在XML文档中,有可能会包含一些非XML格式的数据,这些数据XML处理器无法处理,我们可以通过处理指令来通知其它应用程序来处理这些数据。
处理指令的语法和XML声明类似,以<?开始, 以?>结束。一个常见的使用样式表单的处理指令如下所示:
<?xml-stylesheet href="style.css" type="text/css"?>

在开始标记<?后的第一个字符"xml-stylesheet"叫做处理指令的目标,它必须标识要用到的应用程序,要注意的是对于其它的非W3C定义的处理指令不能以字符串"XML"和"xml"开头;其余的部分是传递给应用程序的字符数据。应用程序从处理指令中取得目标和数据,执行要求的动作。

处理指令的目标可以是要使用的程序的名字,或者是一个类似于xml-stylesheet这样的很多程序可以识别的通用标识符。不同的应用程序支持不同的处理指令,对于不认识的处理指令,大多数应用程序采取忽略的方式进行处理。

xml-stylesheet处理指令总是放在XML声明之后,第一个元素之前。其它的处理指令可以放在除了标记的内部和XML声明之前的任何位置。
要注意,虽然XML声明和处理指令的语法形式相似,但XML声明并不是处理指令,XML处理程序对XML声明和处理指令采取的是不同的处理方式。


本章学习到此为止,下一章学习如何编写DTD。