一个XML文档由两部分构成:第一部分是文档序言,第二部分是文档元素(节点)。
1.文档序言
<?xml 属性1 属性2 ... ?>
如:
<?xml version="1.0" encoding="UTF-8"?>
文档序言通常位于XML文档的顶端,根元素之前出现,它是一个特定的包含XML文档设定信息的部分。XML 文档序言由如下几个部分组成:
1-1. XML 声明
用来设置XML文档解析时所需的基本参数。
XML 声明中的三个属性的名称分别是:version、encoding和standalone。
1-1-1.version
version属性用来声明XML 文档所遵循的XML 标准版本。现在通常情况下该属性的值都是1.0,尽管 XML 1.1 已经称为 W3C 的推荐标准,但是大部分的 XML 解析器还是采用 XML 1.0 标准。version 是 XML 声明中必须包含的一个属性。
1-1-2.encoding
encoding 属性用来告诉 XML 解析程序当前 XML 文档使用什么样的字符编码。该属性是可选的。当 XML 声明中没有明确给出字符编码方式时,XML 解析程序将默认为 XML 文档采用的是 UTF-8 字符编码。
1-1-3.standalone
standalone 属性定义了是否可以在不读取任何其他文件的情况下处理该文档。例如,XML 文档没有引用任何其他文件,则可以指定属性值为 yes。如果 XML 文档引用其他描述该文档可以包含的文件,则可以指定属性值为 no。因为 no 是 standalone 属性默认的属性值,所以较少会在 XML 声明中看到 standalone 属性。
需要注意的是,如果同时设置了 encoding 和 standalone 属性,standalone 属性必须位于 encoding 属性之后。
1-2. 处理指令
为某个特定类型的软件反馈一条特殊的指令。
处理指令(PIs)允许文档包含用于应用程序的指令。指令并不是文档字符数据的一部分,但是必须通过应用程序传递。
处理指令可以用于将信息传递给应用程序。处理指令可以出现在文档任意位置的标记外部。可以出现在序言中,包括文档的类型定义(DTD),文本内容或者文档之后。
处理指令,允许文档中包含由应用程序来处理的指令。在XML文档中,有可能会包含一些非XML格式的数据,这些数据XML处理器无法处理,我们就可以通过处理指令来通知其它应用程序来处理这些数据。
处理指令(PI)的语法和XML声明类似,以<?开始,以?>结束。一个常见的使用样式表单的处理指令如下所示:
<?xml-styesheet herf="hello.css" type="text/css"?>
在开始标记<?后的第一个字符串xml-styesheet 叫做处理指令的目标,它必须标识要用到的应用程序,要注意的是对于其它的非W3C定义的处理指令不能以字符串XML和xml开头,其余的部分是传递给应用程序的字符数据,应用程序从处理指令中取得目标和数据,执行要求的动作。
处理指令的目标可以是要使用的程序的名字,或者是一个类似于xml-stylesheet这样的很多程序可以识别的通过标识符。不同的应用程序支持不同的处理指令,对于不认识的处理指令,大多数应用程序采取忽略的方式进行处理。对于自定义的处理指令,它通常都是由选定的某个应用程序进行处理。因为你所定义的这个处理指令,对于其它应用程序来说并不能识别,这时就会忽略的方式来处理。
xml-stylesheet处理指令总是放在XML声明之后和,第一元素之前。其它的处理指令可以放在标记的内部和XML声明之前的任何位置。
要注意,虽然XML声明和处理指令的语法形式相似,但XML声明并不是处理指令,XML处理程序对XML声明和处理指令采取的是不同的处理方式
下面是处理指令的语法:
<?target instructions?>
其中:
target - 标识指令指向哪个应用程序。
instruction - 字符,描述了应用程序要处理的信息。
处理指令以特殊的
<?xml-stylesheet href="tutorialspointstyle.css" type="text/css"?>
这里,target 就是 xml-stylesheet,href=”tutorialpointstyle.css” 和 type=”text/css” 就是数据或者目标应用程序用将要用来处理给定 XML 文档的指令。
在这种情况下,浏览器通过标示识别目标,XML 应该在显示之间被转换;第一个属性状态说明转换类型是 XSL,第二个属性指向它的位置。
处理指令规则
处理指令可以包含除了 ?> 组合之外的任意数据,它被解释为闭合指令。下面是两个有效的处理指令示例:
<?welcome to pg=10 of tutorials point?>
<?welcome?>
1-3. 文档类型定义
Document Type Definition,文档类型定义,简称DTD。用来描述XML文档的结构。写在XML文档内部的称为内部DTD,相对的还有以独立文件的形式存在的外部DTD。
1-3-1. DTD的结构
a.元素(ELEMENT)的定义规则;
b.元素之间的关系规则;
c.属性(ATTLIST)的定义规则;
d.可使用的实体(ENTITY)或符号(NOTATION)规则。
e.用来设置更多高级的信息,如实体、属性及有效性相关的信息。
注释:用于提醒XML文档作者或临时标注出文档中不完善的部分。
1-3-2. 与XML文档的关系
DTD与XML的关系就像类与对象的关系,或数据库表结构与数据记录的关系。
有了DTD,每个XML文件可以携带一个自身格式的描述。
有了DTD,不同组织的人可以使用一个通用DTD来交换数据。
应用程序可以使用一个标准DTD校验从外部世界接收来的XML数据是否有效。
可以使用DTD校验自己的XML数据。
1-3-3. DTD文档的应用形式
DTD文档有三种应用形式:
1-3-3-1. 内部DTD文档
一个内部DTD的例子:
上半部分是DTD,下面是XML文档,文档要符合DTD。
声明格式:<!DOCTYPE 根元素[定义内容]>
如:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE poem [
<!ELEMENT poem (author, title, content)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT content (#PCDATA)>
]>
<!--为元素poem定义了三个子元素author title content,
这三个元素必须要出现并且必须按照这个顺序
少元素不行,多元素也不行
-->
<!--指明author,title,content里面的内容是字符串类型-->
<poem>
<author>王维</author>
<title>鹿柴</title>
<content>空山不见人,但闻人语声。返景入深林,复照青苔上。</content>
</poem>
上面的文档就是格式良好,并且有效的。
详见其中的注释。
#PCDATA(Parsed Character Data),是一种类型,可解析的字符数据,即字符串。
上面部分是DTD,在下面编写XML文档时,如果不符合其DTD规范,用XMLSpy做检查的时候,是well-formed的,但是却不是valid的。
比如根元素写:
<Students>
</Students>
Validate检查的时候就会报错,根元素和DTD中的poem不符。
1-3-3-2. 外部DTD文档
声明格式:<!DOCTYPE 根元素 SYSTEM "DTD文件路径">
上面是一个内部DTD的例子,下面用一个外部的DTD:
首先,新建一个DTD文档,文件名叫dtd_1.dtd,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT poem (author, title, content)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT content (#PCDATA)>
然后,新建一个XML文档。
如果只写XML元素内容,那么它是一个格式良好的,却不是有效的文档,因为找不到DTD。
需要加入外部DTD文件的名称(同一个路径下只给出文件名即可)。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE poem SYSTEM "dtd_1.dtd">
<poem>
<author>王维</author>
<title>鹿柴</title>
<content>空山不见人,但闻人语声。返景入深林,复照青苔上。</content>
</poem>
1-3-3-3. 内外部DTD文档结合
声明格式:<!DOCTYPE 根元素 SYSTEM "DTD文件路径" [定义内容]>
DTD的内容也可以有些放在外部,有些放在内部,如下:
文件dtd_2.dtd
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT author (#PCDATA)>
<!ELEMENT title (#PCDATA)>
XML文档:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE poem SYSTEM "dtd_2.dtd"[
<!ELEMENT poem (author, title, content)>
<!ELEMENT content (#PCDATA)>
]>
<poem>
<author>王维</author>
<title>鹿柴</title>
<content>空山不见人,但闻人语声。返景入深林,复照青苔上。</content>
</poem>
2.文档元素
XML 文档元素形成的是一个树状结构,因此文档元素也被称为根元素。根元素包含了文档的所有其他元素和数据内容。
XML 文档形成一种树结构
XML 文档必须包含根元素。该元素是所有其他元素的父元素。
XML 文档中的元素形成了一棵文档树。这棵树从根部开始,并扩展到树的最底端。
所有的元素都可以有子元素:
2-1. XML 文档必须有根元素
XML 必须包含根元素,它是所有其他元素的父元素,比如以下实例中 root 就是根元素:
<root>
<child>
<subchild>
.....
</subchild>
</child>
</root>
以下实例中 note 是根元素:
<?xml version="1.0" encoding="UTF-8"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
2-2. XML 声明
XML 声明文件的可选部分,如果存在需要放在文档的第一行,如下所示:
<?xml version="1.0" encoding="utf-8"?>
以上实例包含 XML 版本(
UTF-8 也是 HTML5, CSS, JavaScript, PHP, 和 SQL 的默认编码。
2-3. 所有的 XML 元素都必须有一个关闭标签
在 HTML 中,某些元素不必有一个关闭标签:
<p>This is a paragraph.
<br>
在 XML 中,省略关闭标签是非法的。所有元素都必须有关闭标签:
<p>This is a paragraph.</p>
<br />
注释:从上面的实例中,您也许已经注意到 XML 声明没有关闭标签。这不是错误。声明不是 XML 文档本身的一部分,它没有关闭标签。
2-4. XML 标签对大小写敏感
XML 标签对大小写敏感。标签 <Letter> 与标签 <letter> 是不同的。
必须使用相同的大小写来编写打开标签和关闭标签:
<Message>这是错误的</message>
<message>这是正确的</message>
注释:打开标签和关闭标签通常被称为开始标签和结束标签。不论您喜欢哪种术语,它们的概念都是相同的。
2-5. XML 必须正确嵌套
在 HTML 中,常会看到没有正确嵌套的元素:
<b><i>This text is bold and italic</b></i>
在 XML 中,所有元素都必须彼此正确地嵌套:
<b><i>This text is bold and italic</i></b>
在上面的实例中,正确嵌套的意思是:由于 <i> 元素是在 <b> 元素内打开的,那么它必须在 <b> 元素内关闭。
2-6. XML 属性值必须加引号
与 HTML 类似,XML 元素也可拥有属性(名称/值的对)。
在 XML 中,XML 的属性值必须加引号。
请研究下面的两个 XML 文档。 第一个是错误的,第二个是正确的:
<note date=12/11/2007>
<to>Tove</to>
<from>Jani</from>
</note>
<note date="12/11/2007">
<to>Tove</to>
<from>Jani</from>
</note>
在第一个文档中的错误是,note 元素中的 date 属性没有加引号。
2-7. 实体引用
在 XML 中,一些字符拥有特殊的意义。
如果您把字符 "<" 放在 XML 元素中,会发生错误,这是因为解析器会把它当作新元素的开始。
这样会产生 XML 错误:
<message>if salary < 1000 then</message>
为了避免这个错误,请用实体引用来代替 "<" 字符:
<message>if salary < 1000 then</message>
在 XML 中,有 5 个预定义的实体引用:
< | < | less than |
> | > | greater than |
& | & | ampersand |
' | ' | apostrophe |
" | " | quotation mark |
注释:在 XML 中,只有字符 "<" 和 "&" 确实是非法的。大于号是合法的,但是用实体引用来代替它是一个好习惯。
2-8. XML 中的注释
在 XML 中编写注释的语法与 HTML 的语法很相似。
<!-- This is a comment -->
2-9. 在 XML 中,空格会被保留
HTML 会把多个连续的空格字符裁减(合并)为一个:
HTML: | Hello Tove |
输出结果: | Hello Tove |
在 XML 中,文档中的空格不会被删减。
2-10. XML 以 LF 存储换行
在 Windows 应用程序中,换行通常以一对字符来存储:回车符(CR)和换行符(LF)。
在 Unix 和 Mac OSX 中,使用 LF 来存储新行。
在旧的 Mac 系统中,使用 CR 来存储新行。
XML 以 LF 存储换行。
2-11. 一个元素可以有多个属性
它的基本格式为:
<元素名 属性名1="属性值1" 属性名2="属性值2">
特定的属性名称在同一个元素标记中只能出现一次