XML是一种用于标记电子文件使其具有结构性的标记语言。这是一篇XML的笔记。

概述

XML(eXtensible Markup Language)是标记语言中的一种,以一种更中立的方式,让用户自行决定要如何理解、呈现从服务端所提供的信息,而着重表示数据以及数据之间的联系。

其特点为可扩展性、灵活性、自描述性与简洁性。

一个完整的XML文档大体分为三个部分:文档数据(XML)、文档结构(DTD/Schema)与文档样式(XSL/CSS)。其结构为树形结构。

语法

声明

位于XML文档的第一行,结构一般为:

1
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 

其基本框架为

1
<?xml 版本声明 编码声明 独立声明?>
  • 版本声明 :version属性的取值用于描述当前XML的版本编号,通常情况下为1.0,这是为了将来的新版本能够保持向后的兼容性而设计的。这个属性必须存在,且必须作为第一个属性。
  • 编码声明 :encoding属性的取值用于指明当前XML文档中所使用的符号的编码方式。我们一般选用UTF-8编码。
  • 独立声明 :standalone属性的取值表明当前XML文件是独立使用、还是与其他的标记文件配套使用。如果该属性为yes,表示在解析当前XML文档时,无需其他的外部标记声明文件。

注意

encoding的值与XML文档在文件系统中保存时使用的编码方式没有直接的关系

1
<?target-name data?> 

的语法形式为处理指令 ,用于XML文档的转换,后续会接触到更多处理指令。

注释

注释的基本框架为:

1
<!-- 注释内容  -->

由于“- -”为注释中的保留字符,所以在注释内容中不应该出现双横杠

注释一般为独立出现 ,不应出现在其他元素的标记中,同理,注释也不应该嵌套

元素与属性

基本框架

之所以将其放在一起,是因为它们所起的功能是相似的,其基本框架为:

1
2
3
4
<元素名 属性名1="属性值1" 属性名2="属性值2">
元素内容1
元素内容2
</元素名>

元素与属性可谓XML中的核心,起到了存储数据的功能。其基本框架与HTML类似:元素分为起始标记<元素名>与中止标记</元素名>,被这两个标记所包含的即为元素的内容,内容中可以嵌套其他元素。而属性被包含在元素的起始标记当中,基本结构为属性名=“属性值”,用来为元素添加属性。

元素与属性的使用并没有优劣之分,但一般情况下:考虑到文档的可读性,我们会将简单的标量数据设置为属性,其余一律设置为元素。

由于不同属性之间不允许有重复的属性名,但不同元素可以,所以要是有多个相同内容,就必须使用元素。也正因为此,属性之间是无序的,而元素之间是有序的。例如:若一本书有多个作者,用元素表示会显得更为优雅:

1
2
3
4
5
<book>
<author>Lyx</author>
<author>linyx</author>
</book>

而用元素表示,则较为杂乱:

1
<book author1="Lyx" author2="linyx"></book>

与HTML一样,XML也支持空元素的表示,一般用于只有属性而没有元素内容的元素。如上面这行代码,可以简化成:

1
<book author1="Lyx" author2="linyx"/>

元素中的文本

与HTML相同,在元素的文本中无法清晰地解析一些保留字符,如:

1
<lessthan>1<2</lessthan> 

中的“<”就难以被XML所解析,无法判断到底是字符还是结束标记。所以需要我们用其他字符来代替这些保留字符。XML1.0规范中定义了五种预定义实体:

字符 预定义实体
< &lt;
> &gt;
& &amp;
&apos;
" &quot;

如上述例子将“<”用“&lt;”替代后就能成功被解析:

1
<lessthan>1&lt;2</lessthan> 

(这里无法成功被转换成“<”是我博客解析的问题,写入XML是会正常转换的)

当然,如果觉得这些预定义实体符太难记,也可以用暴力点的方法:CDATA段。可以将整段文本放入CDATA段中:

1
<![CDATA[文本内容]]>

这样一来其中的字符就不会被保留字符所影响,可以直接解析。但需要注意的是,其中的文本内容也不能包含“]]>”的字符串,否则也是会解析错误。同理,CDATA段不应嵌套。

命名空间

和许多编程语言相同,XML也支持命名空间。其基本声明方式为:xmlns:空间名=“URL” ,声明部分应该作为属性存在于某个元素中。这样听起来可能有些抽象,我们来举个例子:

1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="UTF-8"?>
<ns:company xmlns:ns="http://www.myns.com">
<ns:company-info>
<ns:name>SoftwareBG</ns:name>
<ns:fdate>2007-03-17</ns:fdate>
</ns:company-info>
</ns:company>

这里就是从网络上引用了命名空间,并设置其名字为ns,然后应用于该元素极其子元素中。与其他语言一样,命名空间存在其作用域,比如这里的ns就只能在

1
<ns:company xmlns:ns="http://www.myns.com"></ns:company>

中被使用,超出了这个作用域就无法使用。

与其他语言相同,命名空间的名字可以被缺省,简化了命名空间的使用,同时对作用域中的所有元素强制应用:

1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<company xmlns="http://www.myns.com">
<company-info>
<name>SoftwareBG</name>
<fdate>2007-03-17</fdate>
</company-info>
</company>