XML 是一种用于存储和传输数据的与软件和硬件无关的工具。
什么是 XML?
XML 代表eXtensible Markup Language(可扩展标记语言)
。XML 是一种与 HTML 非常相似的标记语言。XML 被设计用于存储和传输数据。XML 被设计成具有自我描述性。XML 不执行任何操作,也许有点难理解,但 XML 不执行任何操作。
XML 示例
这是一张存储为 XML 的给 Tove 的 Jani 的便签:
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
复制代码
上面的 XML 相当自我描述:
它包含了发件人信息
它包含了收件人信息
它有一个标题
它有一个消息正文
但是,上面的 XML 仍然不执行任何操作。XML 只是用标记包装的信息。
必须有人编写一段软件来发送、接收、存储或显示它:
Note
To: Tove
From: Jani
Reminder
Don't forget me this weekend!
复制代码
XML 和 HTML 的区别
XML 和 HTML 是出于不同目的而设计的:
XML 标签不像 HTML 标签那样是预定义的。XML 语言没有预定义的标签。上面示例中的标签(如<to>
和<from>
)在任何 XML 标准中都未定义。这些标签是 XML 文档的作者“创造”的。
HTML 使用预定义标签,如<p>
、<h1>
、<table>
等。使用 XML,作者必须定义标签和文档结构。
XML 是可扩展的
大多数 XML 应用程序即使添加(或删除)新数据也能正常工作。
想象一个应用程序,设计用于显示note.xml
的原始版本(<to>
<from>
<heading>
<body>
)。然后想象一个具有添加的<date>
和<hour>
元素以及删除<heading>
的新版本的note.xml
。
XML 构造的方式使得旧版本的应用程序仍然可以工作:
<note>
<date>2015-09-01</date>
<hour>08:30</hour>
<to>Tove</to>
<from>Jani</from>
<body>Don't forget me this weekend!</body>
</note>
复制代码
旧版本
Note
To: Tove
From: Jani
Reminder
Don't forget me this weekend!
复制代码
新版本
Note
To: Tove
From: Jani
Date: 2015-09-01 08:30
Don't forget me this weekend!
复制代码
XML 简化事务
XML 简化数据共享
XML 简化数据传输
XML 简化平台更改
XML 简化数据可用性
许多计算机系统包含以不兼容格式存储的数据。在不兼容的系统(或升级的系统)之间交换数据对于 Web 开发人员来说是一项耗时的任务。必须转换大量数据,并且通常会丢失不兼容的数据。
XML 以纯文本格式存储数据。这提供了一种与软件和硬件无关的存储、传输和共享数据的方式。
XML 还使得扩展或升级到新的操作系统、新的应用程序或新的浏览器变得更容易,而不会丢失数据。
使用 XML,数据可以供各种“阅读机器”使用,如人类、计算机、语音机器、新闻源等。
XML 的用途
XML 在 Web 开发的许多方面都得到了应用。
XML 分离数据与演示
XML 通常用于将数据与演示分离。XML 不包含有关如何显示的任何信息。相同的 XML 数据可以在许多不同的演示情境中使用。因此,使用 XML,数据和演示之间存在完全的分离。
XML 通常与 HTML 搭配使用
在许多 HTML 应用程序中,XML 用于存储或传输数据,而 HTML 用于格式化和显示相同的数据。
XML 分离数据与 HTML
在 HTML 中显示数据时,当数据发生变化时不应该修改 HTML 文件。使用 XML,数据可以存储在单独的 XML 文件中。通过几行 JavaScript 代码,您可以读取一个 XML 文件并更新任何 HTML 页面的数据内容。
Books.xml
示例:
<?xml version="1.0" encoding="UTF-8"?>
<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">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>
<book category="web" cover="paperback">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
复制代码
事务数据
存在成千上万种 XML 格式,用于描述不同行业的日常数据交易:
股票和股份
金融交易
医疗数据
数学数据
科学测量
新闻信息
天气服务
示例 XML
XMLNews 是用于交换新闻和其他信息的规范。使用标准使得新闻制作者和新闻消费者更容易在不同的硬件、软件和编程语言之间产生、接收和存档任何类型的新闻信息。
一个示例 XMLNews 文档:
<?xml version="1.0" encoding="UTF-8"?>
<nitf>
<head>
<title>Colombia Earthquake</title>
</head>
<body>
<headline>
<hl1>143 Dead in Colombia Earthquake</hl1>
</headline>
<byline>
<bytag>By Jared Kotler, Associated Press Writer</bytag>
</byline>
<dateline>
<location>Bogota, Colombia</location>
<date>Monday January 25 1999 7:28 ET</date>
</dateline>
</body>
</nitf>
复制代码
示例 XML 天气服务
来自美国国家海洋和大气管理局(NOAA)的 XML 国家气象服务:
<?xml version="1.0" encoding="UTF-8"?>
<current_observation>
<credit>NOAA's National Weather Service</credit>
<credit_URL>http://weather.gov/</credit_URL>
<image>
<url>http://weather.gov/images/xml_logo.gif</url>
<title>NOAA's National Weather Service</title>
<link>http://weather.gov</link>
</image>
<location>New York/John F. Kennedy Intl Airport, NY</location>
<station_id>KJFK</station_id>
<latitude>40.66</latitude>
<longitude>-73.78</longitude>
<observation_time_rfc822>Mon, 11 Feb 2008 06:51:00 -0500 EST
</observation_time_rfc822>
<weather>A Few Clouds</weather>
<temp_f>11</temp_f>
<temp_c>-12</temp_c>
<relative_humidity>36</relative_humidity>
<wind_dir>West</wind_dir>
<wind_degrees>280</wind_degrees>
<wind_mph>18.4</wind_mph>
<wind_gust_mph>29</wind_gust_mph>
<pressure_mb>1023.6</pressure_mb>
<pressure_in>30.23</pressure_in>
<dewpoint_f>-11</dewpoint_f>
<dewpoint_c>-24</dewpoint_c>
<windchill_f>-7</windchill_f>
<windchill_c>-22</windchill_c>
<visibility_mi>10.00</visibility_mi>
<icon_url_base>http://weather.gov/weather/images/fcicons/</icon_url_base>
<icon_url_name>nfew.jpg</icon_url_name>
<disclaimer_url>http://weather.gov/disclaimer.html</disclaimer_url>
<copyright_url>http://weather.gov/disclaimer.html</copyright_url>
</current_observation>
复制代码
XML 树
XML 文档形成了一棵树状结构,从“根”开始分支到“叶子”。
XML 树结构
DOM 节点树
一个 XML 文档可以被看作是一棵树,这被称为DOM(Document Object Model)节点树
。DOM 节点树以根节点为起点,分支到各个子节点,形成一个层级结构。
一个 XML 文档的示例
上图表示了 XML 中的图书:
<?xml version="1.0" encoding="UTF-8"?>
<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>
复制代码
XML 树结构
XML 文档被形成为元素树。
XML 树始于根元素,从根元素分支到子元素。
所有元素都可以有子元素(子元素):
<root>
<child>
<subchild>.....</subchild>
</child>
</root>
复制代码
术语父元素、子元素和兄弟元素用于描述元素之间的关系。
父元素有子元素。
子元素有父元素。
兄弟元素是在同一级别上的子元素(兄弟姐妹)。
所有元素都可以有文本内容(例如:Harry Potter)和属性(例如:category="cooking")。
自描述语法
XML 使用了一种非常自描述的语法。
一个前导定义了 XML 版本和字符编码:
<?xml version="1.0" encoding="UTF-8"?>
复制代码
下一行是文档的根元素:
下一行开始了一个<book>
元素:
<book category="cooking">
复制代码
<book>
元素有 4 个子元素:<title>
、<author>
、<year>
、<price>
。
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
复制代码
下一行结束了<book>
元素:
从这个例子中,您可以假设 XML 文档包含了有关书店中书籍的信息。
XML 语法规则
XML 的语法规则非常简单和逻辑。这些规则易于学习和使用。
XML 文档必须有一个根元素
XML 文档必须包含一个作为所有其他元素的父元素的根元素:
<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>
复制代码
XML 前导部分
这一行被称为 XML 前导部分:
<?xml version="1.0" encoding="UTF-8"?>
复制代码
XML 前导部分是可选的。如果存在,它必须在文档中首先出现。
所有 XML 元素必须有一个结束标签
在 XML 中,省略结束标签是非法的。所有元素必须有一个结束标签:
<p>This is a paragraph.</p>
<br />
复制代码
XML 标签区分大小写
XML 标签是区分大小写的。标签<Letter>
与标签<letter>
是不同的。
开放和关闭标签必须使用相同的大小写
<message>This is correct</message>
复制代码
“开放和关闭标签”通常被称为“开始和结束标签”。
XML 元素必须嵌套正确
在 XML 中,所有元素必须在彼此之内正确嵌套:
<b><i>This text is bold and italic</i></b>
复制代码
XML 属性值必须始终用引号括起来
XML 元素可以具有类似 HTML 中的名称/值对的属性。在 XML 中,属性值必须始终用引号括起来:
<note date="12/11/2007">
<to>Tove</to>
<from>Jani</from>
</note>
复制代码
实体引用
在 XML 中,一些字符具有特殊的含义。为了避免解释错误,需要使用实体引用:
<message>salary < 1000</message>
复制代码
XML 中的注释
在 XML 中编写注释的语法与 HTML 类似:
<!-- This is a comment -->
复制代码
在 XML 中保留空白
XML 不截断多个空白,保留所有空白字符。
XML 将新行存储为 LF
XML 将新行存储为 LF(Line Feed)。
格式良好的 XML
符合上述语法规则的 XML 文档被称为“格式良好”的 XML 文档。
XML 元素
一个 XML 文档包含 XML 元素。
什么是 XML 元素?
一个 XML 元素是从(包括)元素的开始标签到(包括)元素的结束标签的所有内容。
一个元素可以包含:
<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>
复制代码
在上面的例子中:
<title>
、<author>
、<year>
和<price>
具有文本内容,因为它们包含文本(如 29.99)。
<bookstore>
和 <book>
具有元素内容,因为它们包含元素。
<book>
具有一个属性(category="children"
)。
空 XML 元素
没有内容的元素被称为空元素。
在 XML 中,可以这样表示一个空元素:
也可以使用所谓的自闭合标签:
这两种形式在 XML 软件(阅读器、解析器、浏览器)中产生相同的结果。
空元素可以有属性。
XML 命名规则
XML 元素必须遵循以下命名规则:
除了 xml,任何名称都可以使用,没有保留的单词(除了 xml)。
最佳命名实践
命名约定
一些常用的 XML 元素命名约定:
小写:<firstname>
(所有字母都小写)
大写:<FIRSTNAME>
(所有字母都大写)
蛇形命名:<first_name>
(下划线分隔单词,常用于 SQL 数据库)
帕斯卡命名:<FirstName>
(每个单词的首字母大写,C 程序员常用)
骆驼命名:<firstName>
(每个单词的首字母大写,除了第一个,JavaScript 中常用)
提示! 选择您的命名风格,并始终保持一致!
XML 元素是可扩展的
XML 元素可以扩展以携带更多的信息。
看下面的 XML 示例:
<note>
<to>Tove</to>
<from>Jani</from>
<body>Don't forget me this weekend!</body>
</note>
复制代码
假设我们创建了一个应用程序,从 XML 文档中提取<to>
、<from>
和<body>
元素以生成以下输出:
MESSAGE
To: Tove
From: Jani
Don't forget me this weekend!
复制代码
想象一下,XML 文档的作者向其添加了一些额外的信息:
<note>
<date>2008-01-10</date>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
复制代码
应用程序是否应该崩溃或中断?
不应该。应用程序应该仍然能够在 XML 文档中找到<to>
、<from>
和<body>
元素,并生成相同的输出。
这是 XML 的优点之一。它可以在不破坏应用程序的情况下进行扩展。
XML 属性
XML 元素可以有属性,就像 HTML 一样。
XML 属性必须用引号括起来
属性值必须始终用引号括起来。可以使用单引号或双引号。
对于一个人的性别,<person>
元素可以这样写:
或者像这样:
如果属性值本身包含双引号,可以使用单引号,就像在这个例子中:
<gangster name='George "Shotgun" Ziegler'>
复制代码
或者可以使用字符实体:
<gangster name="George "Shotgun" Ziegler">
复制代码
XML 元素 vs 属性
在 XML 中,没有规定何时使用属性或何时使用元素的规则。
我最喜欢的方式
以下三个 XML 文档包含完全相同的信息:
在第一个例子中使用了一个 date 属性:
<note date="2008-01-10">
<to>Tove</to>
<from>Jani</from>
</note>
复制代码
在第二个例子中使用了一个<date>
元素:
<note>
<date>2008-01-10</date>
<to>Tove</to>
<from>Jani</from>
</note>
复制代码
在第三个例子中使用了一个扩展的<date>
元素:(这是我最喜欢的)
<note>
<date>
<year>2008</year>
<month>01</month>
<day>10</day>
</date>
<to>Tove</to>
<from>Jani</from>
</note>
复制代码
避免使用 XML 属性?
在使用属性时要考虑的一些事项有:
属性不能包含多个值(元素可以)
属性不能包含树结构(元素可以)
属性不容易扩展(以适应将来的更改)
不要陷入这种情况:
<note day="10" month="01" year="2008"
to="Tove" from="Jani" heading="Reminder"
body="Don't forget me this weekend!">
</note>
复制代码
用于元数据的 XML 属性
有时会为元素分配 ID 引用。这些 ID 可以用来识别 XML 元素,方式与 HTML 中的 id 属性类似。以下是此示例:
<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>
复制代码
上述 id 属性用于标识不同的注释。它不是注释本身的一部分。
我想在这里说的是,元数据(关于数据的数据)应该存储为属性,而数据本身应该存储为元素。
XML 命名空间
XML 命名空间提供了一种避免元素名称冲突的方法。
名称冲突
在 XML 中,元素名称由开发人员定义。这通常导致在尝试混合来自不同 XML 应用程序的 XML 文档时发生冲突。
这个 XML 包含 HTML 表信息:
<table>
<tr>
<td>Apples</td>
<td>Bananas</td>
</tr>
</table>
复制代码
这个 XML 包含有关桌子(家具的一部分)的信息:
<table>
<name>African Coffee Table</name>
<width>80</width>
<length>120</length>
</table>
复制代码
如果将这些 XML 片段相加,将会出现名称冲突。两者都包含一个<table>
元素,但这些元素具有不同的内容和含义。
用户或 XML 应用程序将不知道如何处理这些差异。
使用前缀解决名称冲突
在 XML 中,可以通过使用名称前缀轻松避免名称冲突。
这个 XML 包含有关 HTML 表和家具的信息:
<h:table>
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
<f:table>
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
复制代码
在上面的例子中,不会发生冲突,因为这两个<table>
元素具有不同的名称。
XML 命名空间 - xmlns 属性
在 XML 中使用前缀时,必须为前缀定义一个命名空间。可以通过元素的开始标记中的 xmlns 属性来定义命名空间。
命名空间声明具有以下语法:xmlns:prefix="URI"。
<root>
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
</root>
复制代码
在上面的例子中:
当为元素定义命名空间时,所有具有相同前缀的子元素都与相同的命名空间相关联。
命名空间也可以在 XML 根元素中声明:
<h:table>
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
<f:table>
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
</root>
复制代码
注意: 解析器不使用命名空间 URI 查找信息。使用 URI 的目的是为命名空间提供一个唯一的名称。然而,公司通常将命名空间用作指向包含命名空间信息的网页的指针。
统一资源标识符(URI)
统一资源标识符(URI)是一个字符串,用于标识互联网资源。最常见的 URI 是统一资源定位符(URL),用于标识互联网域地址。另一种不太常见的 URI 类型是统一资源名称(URN)。
默认命名空间
为元素定义默认命名空间可以避免在所有子元素中使用前缀。它具有以下语法:xmlns="namespaceURI"。
这个 XML 包含 HTML 表信息:
<tr>
<td>Apples</td>
<td>Bananas</td>
</tr>
</table>
复制代码
这个 XML 包含有关家具的信息:
<name>African Coffee Table</name>
<width>80</width>
<length>120</length>
</table>
复制代码
实际使用中的命名空间
XSLT 是一种可用于将 XML 文档转换为其他格式的语言。
下面的 XML 文档是用于将 XML 转换为 HTML 的文档。
命名空间"http://www.w3.org/1999/XSL/Transform"标识 HTML 文档中的 XSLT 元素:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr>
<th style="text-align:left">Title</th>
<th style="text-align:left">Artist</th>
</tr>
<xsl:for-each select="catalog/cd">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
复制代码
最后
为了方便其他设备和平台的小伙伴观看往期文章:
微信公众号搜索:Let us Coding
,关注后即可获取最新文章推送
看完如果觉得有帮助,欢迎点赞、收藏、关注
评论