1. XML简介

什么是XML?

XML(可扩展标记语言)是一种标记语言,与HTML非常相似。XML被设计用来传输和存储数据,而HTML被设计用来显示数据。

XML与HTML的区别:

  • XML的设计宗旨是传输数据,焦点是数据的内容
  • HTML被设计用来显示数据,焦点是数据的外观

XML基本示例

1
2
3
4
5
6
7
<?xml version="1.0" encoding="UTF-8"?>
<site>
<name>RUNOOB</name>
<url>https://www.runoob.com</url>
<logo>runoob-logo.png</logo>
<desc>编程学习网站</desc>
</site>

XML便签示例

1
2
3
4
5
6
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

XML的特点

  • XML不会做任何事情:XML仅仅是包装在XML标签中的纯粹的信息,需要编写软件或程序来传送、接收和显示文档
  • 没有预定义标签:HTML中使用的标签都是预定义的,而XML允许创作者定义自己的标签和文档结构
  • 数据分离:通过XML,数据能够存储在独立的XML文件中,可以专注于使用HTML/CSS进行显示和布局

2. XML树结构

树形结构概念

XML文档形成了一种树结构,它从”根部”开始,然后扩展到”枝叶”。

XML声明和根元素

1
2
3
4
5
6
7
<?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>
  • 第一行是XML声明,定义XML的版本(1.0)和所使用的编码(UTF-8)
  • ``描述文档的根元素
  • 接下来4行描述根的4个子元素(to, from, heading, body)
  • 最后一行``定义根元素的结尾

书店示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>

DOM概念

XML将数据组织成为一棵树,DOM通过解析XML文档,为XML文档在逻辑上建立一个树模型。树的节点是一个个的对象,通过操作这棵树和这些对象就可以完成对XML文档的操作。

3. XML语法规则

XML声明

1
<?xml version="1.0" encoding="utf-8"?>

XML声明是文档的可选部分,如果存在需要放在文档的第一行。

根元素

XML文档必须有根元素,它是所有其他元素的父元素:

1
2
3
4
5
<root>
<child>
<subchild>.....</subchild>
</child>
</root>

属性

元素可以包含属性,属性提供有关元素的附加信息:

1
<person age="30" gender="male">John Doe</person>

单标签

XML允许使用单标签:

1
2
3
<elementName attribute="value" />
<!-- 或者 -->
<elementName></elementName>

标签大小写敏感

XML标签对大小写敏感:

1
2
3
4
5
<!-- 错误 -->
<Message>这是错误的</message>

<!-- 正确 -->
<message>这是正确的</message>

正确嵌套

XML元素必须正确嵌套:

1
2
3
4
5
<!-- 正确 -->
<b><i>This text is bold and italic</i></b>

<!-- 错误 -->
<b><i>This text is bold and italic</b></i>

属性值加引号

XML的属性值必须加引号:

1
2
3
4
<note date="12/11/2007">
<to>Tove</to>
<from>Jani</from>
</note>

实体引用

在XML中,一些字符拥有特殊的意义,需要使用实体引用:

1
<message>if salary &lt; 1000 then</message>

5个预定义的实体引用:

  • << (less than)
  • >> (greater than)
  • && (ampersand)
  • '' (apostrophe)
  • "" (quotation mark)

空格保留

在XML中,空格会被保留(不像HTML会合并多个连续空格):

1
2
3
4
5
6
7
<bookstore>
<book>
<title>xx xxx</title>
<author>John Doe</author>
<price>29.99</price>
</book>
</bookstore>

4. XML元素

元素的组成

XML元素指的是从开始标签直到结束标签的部分。一个元素可以包含:

  • 其他元素
  • 文本
  • 属性
  • 或以上所有的混合

元素示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<bookstore>
<book category="CHILDREN">
<title>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title>Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>

XML命名规则

XML元素必须遵循以下命名规则:

  • 名称可以包含字母、数字以及其他字符
  • 名称不能以数字或标点符号开始
  • 名称不能以字母xml(或者XML、Xml等等)开始
  • 名称不能包含空格

命名习惯

  • 使名称具有描述性
  • 名称应简短和简单
  • 避免使用”-“、”.”、“:”字符

XML的可扩展性

1
2
3
4
5
<note>
<to>Tove</to>
<from>Jani</from>
<body>Don't forget me this weekend!</body>
</note>

XML的优势之一,就是可以在不中断应用程序的情况下进行扩展。

5. XML属性

属性的作用

XML元素具有属性,类似HTML。属性提供有关元素的额外信息,通常提供不属于数据组成部分的信息。

属性必须加引号

属性值必须被引号包围,单引号和双引号均可使用:

1
2
3
4
5
6
7
8
9
<person sex="female">
<!-- 或者 -->
<person sex='female'>

<!-- 如果属性值包含双引号,可以使用单引号 -->
<gangster name='George "Shotgun" Ziegler'>

<!-- 或者使用字符实体 -->
<gangster name="George &quot;Shotgun&quot; Ziegler">

元素vs属性

1
2
3
4
5
6
7
8
9
10
11
12
<!-- 使用属性 -->
<person sex="female">
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>

<!-- 使用元素 -->
<person>
<sex>female</sex>
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>

为什么要避免使用属性

使用属性会引起一些问题:

  • 属性不能包含多个值(元素可以)
  • 属性不能包含树结构(元素可以)
  • 属性不容易扩展(为未来的变化)
  • 属性难以阅读和维护

建议: 尽量使用元素来描述数据,仅仅使用属性来提供与数据无关的信息。

针对元数据的XML属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<messages>
<note id="501">
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
<note id="502">
<to>Jani</to>
<from>Tove</from>
<heading>Re: Reminder</heading>
<body>I will not</body>
</note>
</messages>

原则: 元数据(有关数据的数据)应当存储为属性,而数据本身应当存储为元素。

6. XML验证

形式良好的XML

“形式良好”的XML文档拥有正确的语法,必须遵循以下规则:

  • XML文档必须有一个根元素
  • XML元素都必须有一个关闭标签
  • XML标签对大小写敏感
  • XML元素必须被正确的嵌套
  • XML属性值必须加引号

DTD验证

1
<!DOCTYPE note SYSTEM "Note.dtd">
  • DOCTYPE声明是对外部DTD文件的引用
  • DTD的目的是定义XML文档的结构
  • 通过DTD验证的XML是”合法”的XML
  • W3C支持一种基于XML的DTD代替者,叫做XML Schema

XML验证的重要性

XML文档中的错误会终止XML应用程序。W3C的XML规范声明:如果XML文档存在错误,那么程序就不应当继续处理这个文档。

7. XML查看和显示

浏览器查看

在所有主流的浏览器中,均能够查看原始的XML文件。但不要指望XML文件会直接显示为HTML页面。

1
2
3
4
5
6
7
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

使用CSS格式化XML

通过使用CSS,您可以添加显示信息到XML文档中,但这不是常用的方法。

使用XSLT转换

XSLT是首选的XML样式表语言,可以把XML文档转换成HTML格式。

XML数据示例:

1
2
3
4
5
6
7
8
9
10
11
12
<books>
<book>
<title>Effective Java</title>
<author>Joshua Bloch</author>
<price>59.99</price>
</book>
<book>
<title>Clean Code</title>
<author>Robert C. Martin</author>
<price>49.99</price>
</book>
</books>

XSLT样式表示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- 定义模板匹配根元素 -->
<xsl:template match="/">
<html>
<body>
<h2>My Book List</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Title</th>
<th>Author</th>
<th>Price</th>
</tr>
<!-- 应用模板匹配每个 book 元素 -->
<xsl:apply-templates select="books/book"/>
</table>
</body>
</html>
</xsl:template>

<!-- 定义模板匹配每个 book 元素 -->
<xsl:template match="books/book">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="author"/></td>
<td><xsl:value-of select="price"/></td>
</tr>
</xsl:template>
</xsl:stylesheet>

XSLT元素说明:

  • xsl:stylesheet:XSLT文件的根元素,指定XSLT的版本和命名空间
  • xsl:template:定义模板,match属性指定模板匹配的XML元素
  • xsl:apply-templates:调用其他模板,处理指定的XML元素
  • xsl:value-of:提取XML元素中的文本内容并插入到输出中

总结

XML是一种强大的数据存储和传输格式,具有以下特点:

  1. 结构化:采用树形结构,层次清晰
  2. 可扩展:可以自定义标签和结构
  3. 平台无关:跨平台数据交换标准
  4. 严格语法:必须遵循严格的语法规则
  5. 可验证:可以通过DTD或Schema验证文档结构
  6. 可转换:可以通过XSLT转换为其他格式

XML在Web开发、数据交换、配置文件等领域都有广泛应用,是现代信息系统中不可或缺的技术标准。