可扩展标记语言(Extensible Markup Language),标准通用标记语言的子集,简称XML。是一种用于标记电子文件使其具有结构性的标记语言

在电子计算机中,标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种的信息比如文章它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据是Internet环境中跨平台的、依赖于内容的技术,也是当今处理分布式结构信息的有效工具。早在1998年,W3C就发布了XML1.0规范,使用它来简化Internet的文档信息传输。

简介

可扩展标记语言与Access,Oracle和SQL Server等数据库不同,数据库提供了更强有力的数据存储和分析能力,例如:数据索引、排序、查找、相关一致性等,可扩展标记语言仅仅是存储数据。事实上它与其他数据表现形式最大的不同是:可扩展标记语言极其简单,这是一个看上去有点琐细的优点,但正是这点使它与众不同。

XML的简单易于在任何应用程序中读/写数据,这使XML很快成为数据交换的唯一公共语言,虽然不同的应用软件也支持其他的数据交换格式,但不久之后它们都将支持XML,那就意味着程序可以更容易的与Windows、Mac OS、Linux以及其他平台下产生的信息结合,然后可以很容易加载XML数据到程序中并分析它,并以XML格式输出结果。

发展历史

XML有两个先驱:SGML和HTML,这两个语言都是非常成功的标记语言,但是都有一些与生俱来的缺陷。XML正是为了解决它们的不足而诞生的。

SGML

早在Web未发明之前,SGML(Standard Generalized Markup Language,标准通用标记语言)就已存在,正如它的名称所言,SGML是国际上定义电子文件结构和内容描述的标准SGML具有非常复杂的文档结构,主要用于大量高度结构化数据的访问和其他各种工业领域,在分类和索引数据中非常有用。

虽然SGML的功能很强大,但是它不适用于Web数据描述,而且SGML软件的价格非常昂贵;另外,SGML十分庞大,既不容易学,又不容易使用,在计算机上实现也十分困难:不仅如此,几个主要的浏览器厂商都明确拒绝支持SGML,这无疑是SGML在网上传播遇到的最大障碍。鉴于这些因素,Web的发明者——欧洲核子物理研究中心的研究人员,根据当时(1989年)的计算机技术,发明并推出了HTML。

HTML

1989年,HTML诞生,它抛弃了SGML复杂庞大的缺点,继承了SGML的很多优点。HTML最大的特点是简单性和跨平台性。

HTML是一种界面技术,它只使用了SGML中很少的一部分标记,例如HTML 4.0中只定义了70余种标记。为了便于在计算机上实现,HTML规定的标记是固定的,即HTML语法是不可扩展。HTML这种固定的语法使它易学易用,在计算机上开发HTML的浏览器也十分容易。正是由于HTML的简单性,使得基于HTML的Web应用得到了极大的发展。

XML的产生

随着Web应用的不断发展,HTML的局限性也越来越明显地显现了出来,如HTML无法描述数据、可读性差、搜索时间长等。人们又把目光转向SGML,再次改造SGML使之适应现在的网络需求。随着先辈的努力,1998年2月10日,W3C(World Wide Web Consortium,万维网联盟)公布XML 1.0标准,XML诞生了。

XML最初的设计目的是为了EDI(Electronic Data Interchange,电子数据交换),确切地说是为EDI提供一个标准数据格式。

当前的一些网站内容建设者们已经开始开发各种各样的XML扩展,比如数学标记语言MathML、化学标记语言CML等。此外,一些著名的IT公司,如Oracle、IBM以及微软等都积极地投入人力与财力研发XML相关软件与服务支持,这无疑确定了XML在IT产业的重要地位。

特征

XML具有以下特点:

(1) XML可以从HTML中分离数据。即能够在HTML文件之外将数据存储在XML文档中,这样可以使开发者集中精力使用HTML做好数据的显示和布局,并确保数据改动时不会导致HTML文件也需要改动,从而方便维护页面。XML也能够将数据以“数据岛”的形式存储在HTML页面中,开发者依然可以把精力集中到使用HTML格式化和显示数据上。

(2) XML可用于交换数据。基于XML可以在不兼容的系统之间交换数据,计算机系统和数据库系统所存储的数据有多种形式,对于开发者来说,最耗时间的工作就是在遍布网络的系统之间交换数据。把数据转换为XML格式存储将大大减少交换数据时的复杂性,还可以使这些数据能被不同的程序读取。(A系统将它产生的数据发给B系统,B系统将它产生的数据发给A系统)

(3) XML可应用于B2B中。例如在网络中交换金融信息, 目前XML正成为遍布网络的商业系统之间交换信息所使用的主要语言,许多与B2B有关的完全基于XML的应用程序正在开发中。

(4)利用XML可以共享数据。XML数据以纯文本格式存储,这使得XML更易读、更便于记录、更便于调试,使不同系统、不同程序之间的数据共享变得更加简单(A、B系统将各自拥有的数据共享出来,多个系统可以综合利用)

(5) XML可以充分利用数据。XML是与软件、硬件和应用程序无关的,数据可以被更多的用户、设备所利用,而不仅仅限于基于HTML标准的浏览器。其他客户端和应用程序可以把XML文档作为数据源来处理,就像操作数据库一样,XML的数据可以被各种各样的“阅读器”处理。

(6) XML可以用于创建新的语言。比如,WAP和WML语言都是由XML发展来的。WML(Wireless Markup Language,无线标记语言)是用于标识运行于手持设备上(比如手机)的Internet程序的工具,它就采用了XML的标准。

总之,XML使用一个简单而又灵活的标准格式,为基于Web的应用提供了一个描述数据和交换数据的有效手段。但是,XML并非是用来取代HTML的。HTML着重如何描述将文件显示在浏览器中,而XML与SGML相近,它着重描述如何将数据以结构化方式表示。

格式

XML文件格式是纯文本格式,在许多方面类似于HTML,XML由XML元素组成,每个XML元素包括一个开始标记(),一个结束标记()以及两个标记之间的内容,例如,可以将XML元素标记为价格、订单编号或名称。标记是对文档存储格式和逻辑结构的描述。在形式上,标记中可能包括注释、引用、字符数据段、起始标记、结束标记、空元素、文档类型声明( DTD)和序言。

具体规则如下:

必须有声明语句。

XML声明是XML文档的第一句,其格式如下:

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

注意大小写

在XML文档中,大小写是有区别的。“A”和“a”是不同的标记。注意在写元素时,前后标记的大小写要保持一致。最好养成一种习惯,或者全部大写,或者全部小写,或者大写第一个字母,这样可以减少因为大小写不匹配而产生的文档错误。

XML文档有且只有一个根元素

良好格式的XML文档必须有一个根元素,就是紧接着声明后面建立的第一个元素,其他元素都是这个根元素的子元素,根元素完全包括文档中其他所有的元素。根元素的起始标记要放在所有其他元素的起始标记之前;根元素的结束标记要放在所有其他元素的结束标记之后。

属性值使用引号

在HTML代码里面,属性值可以加引号,也可以不加。但是XML规定,所有属性值必须加引号(可以是单引号,也可以是双引号,建议使用双引号),否则将被视为错误。

所有的标记必须有相应的结束标记

在HTML中,标记可以不成对出现,而在XML中,所有标记必须成对出现,有一个开始标记,就必须有一个结束标记,否则将被视为错误。

所有的空标记也必须被关闭

空标记是指标记对之间没有内容的标记,比如“”等标记。在XML中,规定所有的标记必须有结束标记。

实体引用

在 XML 中,一些字符拥有特殊的意义

如果你把字符 "<" 放在 XML 元素中,会发生错误,这是因为解析器会把它当作新元素的开始。

这样会产生 XML 错误:

<message>if salary < 1000 then</message>

为了避免这个错误,请用实体引用来代替 "<" 字符:

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

在 XML 中,有 5 个预定义的实体引用:

&lt;<小于(less)
&gt;>大于(greater)
&amp;&和号(ampersand)
&apos;'单引号(apostrophe)
&quot;"引号(quote)

注释:在 XML 中,只有字符 "<" 和 "&" 确实是非法的。大于号是合法的,但是用实体引用来代替它是一个好习惯。

XML 中的注释

在 XML 中编写注释的语法与 HTML 的语法很相似:

<!-- This is a comment --> 

在 XML 中,空格会被保留

HTML 会把多个连续的空格字符裁减(合并)为一个:

HTML:	Hello           my name is David.
输出:	Hello my name is David.

在 XML 中,文档中的空格不会被删节。

XML 以 LF 存储换行

在 Windows 应用程序中,换行通常以一对字符来存储:回车符 (CR) 和换行符 (LF)。这对字符与打字机设置新行的动作有相似之处。在 Unix 应用程序中,新行以 LF 字符存储。而 Macintosh 应用程序使用 CR 来存储新行。

XML 文档形成一种树结构

XML 文档必须包含根元素。该元素是所有其他元素的父元素。

XML 文档中的元素形成了一棵文档树。这棵树从根部开始,并扩展到树的最底端。

所有元素均可拥有子元素:

<root>
  <child>
    <subchild>.....</subchild>
  </child>
</root>

父、子以及同胞等术语用于描述元素之间的关系。父元素拥有子元素。相同层级上的子元素成为同胞(兄弟或姐妹)。

所有元素均可拥有文本内容和属性(类似 HTML 中)。

实例

上图表示下面的 XML 中的一本书:

<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>

例子中的根元素是 <bookstore>。文档中的所有 <book> 元素都被包含在 <bookstore> 中。

<book> 元素有 4 个子元素:<title>、< author>、<year>、<price>。 

与HTML区别

(1)可扩展性方面:HTML不允许用户自行定义他们自己的标识或属性,而在XML中,用户能够根据需要自行定义新的标识及属性名,以便更好地从语义上修饰数据。

(2)结构性方面:HTML不支持深层的结构描述,XML的文件结构嵌套可以复杂到任意程度,能表示面向对象的等级层次。。

(3)可校验性方面:HTML没有提供规范文件以支持应用软件对HTML文件进行结构校验,而XML文件可以包括一个语法描述,使应用程序可以对此文件进行结构校验。

标准体系

虽然XML标准本身简单,但与XML相关的标准却种类繁多,W3C制定的相关标准就有二十多个,采用XML制定的重要的电子商务标准就有十多个。这一方面说明XML确实是一种非常实用的结构化通用标记语言,并且已经得到广泛应用;另一方面,这又为了解这些标准带来一定的困难,除了标准种类繁多外,标准之间通常还互相引用,特别是应用标准,它们的制定不仅仅使用的是XML标准本身,还常常用到了其他很多标准。XML标准的体系与SGML标准的体系非常相似,XML相关标准也可分为元语言标准、基础标准、应用标准三个层次。

元语言标准

描述的是用来描述标准的元语言。在XML标准体系中就是XML标准,是整个体系的核心,其他XML相关标准都是用它制定的或为其服务的。

基础标准

这一层次的标准是为XML的进一步实用化制定的标准,规定了采用XML制定标准时的一些公用特征、方法或规则。如 XML Schema描述了更加严格地定义XML文档的方法,以便可以更自动化处理XML文档XMLNamespace用于保证 XML DTD中名字的一致性,以便不同的DTD中的名字在需要时可以合并到一个文档中XSL是描述XML文档样式与转换的一种语言;XLink用来描述XML文档中的超链接;XPointer描述了定位到XML文档结构内部的方法;DOM定义了与平台和语言无关的接口,以便程序和脚本动态访问和修改文档内容、结构及样式等。

应用标准

XML已开始被广泛接受,大量的应用标准,特别是针对因特网的应用标准,纷纷采用XML进行制定。有人甚至认为,XML标准是因特网时代的ASCII标准。在这因特网时代,几乎所有的行业领域都与因特网有关。而它们旦与因特网发生关系,都必然要有其行业标准,而这些标准往往采用XML来制定。

XML验证

拥有正确语法的 XML 被称为“形式良好”的 XML。

通过 DTD 验证的 XML 是“合法”的 XML。

形式良好的 XML 文档

“形式良好”或“结构良好”的 XML 文档拥有正确的语法。

“形式良好”(Well Formed)的 XML 文档会遵守前几章介绍过的 XML 语法规则:

  • XML 文档必须有根元素
  • XML 文档必须有关闭标签
  • XML 标签对大小写敏感
  • XML 元素必须被正确的嵌套
  • XML 属性必须加引号
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
    <to>George</to>
    <from>John</from>
    <heading>Reminder</heading>
    <body>Don't forget the meeting!</body>
</note>

验证 XML 文档

合法的 XML 文档是“形式良好”的 XML 文档,同样遵守文档类型定义 (DTD) 的语法规则:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE note SYSTEM "Note.dtd">

<note>
    <to>George</to>
    <from>John</from>
    <heading>Reminder</heading>
    <body>Don't forget the meeting!</body>
</note>  

在上例中,DOCTYPE 声明是对外部 DTD 文件的引用。下面的段落展示了这个文件的内容。

XML DTD

DTD 的作用是定义 XML 文档的结构。它使用一系列合法的元素来定义文档结构:

<!DOCTYPE note [
  <!ELEMENT note (to,from,heading,body)>
  <!ELEMENT to      (#PCDATA)>
  <!ELEMENT from    (#PCDATA)>
  <!ELEMENT heading (#PCDATA)>
  <!ELEMENT body    (#PCDATA)>
]> 

XML Schema

W3C 支持一种基于 XML 的 DTD 代替者,它名为 XML Schema:

<xs:element name="note">

<xs:complexType>
  <xs:sequence>
    <xs:element name="to"      type="xs:string"/>
    <xs:element name="from"    type="xs:string"/>
    <xs:element name="heading" type="xs:string"/>
    <xs:element name="body"    type="xs:string"/>
  </xs:sequence>
</xs:complexType>

</xs:element> 

XML 命名空间(XML Namespaces)

XML 命名空间提供避免元素命名冲突的方法。

命名冲突

在 XML 中,元素名称是由开发者定义的,当两个不同的文档使用相同的元素名时,就会发生命名冲突。

这个 XML 文档携带着某个表格中的信息:

<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 解析器无法确定如何处理这类冲突。

使用前缀来避免命名冲突

此文档带有某个表格中的信息:

<h:table>
   <h:tr>
   <h:td>Apples</h:td>
   <h:td>Bananas</h:td>
   </h:tr>
</h:table>

注:上面的命名空间是h。

此 XML 文档携带着有关一件家具的信息:

<f:table>
   <f:name>African Coffee Table</f:name>
   <f:width>80</f:width>
   <f:length>120</f:length>
</f:table>

现在,命名冲突不存在了,这是由于两个文档都使用了不同的名称来命名它们的 <table> 元素 (<h:table> 和 <f:table>)。

注:上面的命名空间是f。

通过使用前缀,我们创建了两种不同类型的 <table> 元素。

使用命名空间(Namespaces)

这个 XML 文档携带着某个表格中的信息:

<h:table xmlns:h="http://www.w3.org/TR/html4/">
   <h:tr>
   <h:td>Apples</h:td>
   <h:td>Bananas</h:td>
   </h:tr>
</h:table>

此 XML 文档携带着有关一件家具的信息:

<f:table xmlns:f="http://www.w3school.com.cn/furniture">
   <f:name>African Coffee Table</f:name>
   <f:width>80</f:width>
   <f:length>120</f:length>
</f:table>

与仅仅使用前缀不同,我们为 <table> 标签添加了一个 xmlns 属性,这样就为前缀赋予了一个与某个命名空间相关联的限定名称。

XML Namespace (xmlns) 属性

XML 命名空间属性被放置于元素的开始标签之中,并使用以下的语法:

xmlns:namespace-prefix="namespaceURI"

当命名空间被定义在元素的开始标签中时,所有带有相同前缀的子元素都会与同一个命名空间相关联。

注释:用于标示命名空间的地址不会被解析器用于查找信息。其惟一的作用是赋予命名空间一个惟一的名称。不过,很多公司常常会作为指针来使用命名空间指向实际存在的网页,这个网页包含关于命名空间的信息。

请访问 HTML 4.01 Specification

统一资源标识符(Uniform Resource Identifier (URI))

统一资源标识符是一串可以标识因特网资源的字符。最常用的 URI 是用来标示因特网域名地址的统一资源定位器(URL)。另一个不那么常用的 URI 是统一资源命名(URN)。在我们的例子中,我们仅使用 URL。

默认的命名空间(Default Namespaces)

为元素定义默认的命名空间可以让我们省去在所有的子元素中使用前缀的工作。

请使用下面的语法:

xmlns="namespaceURI"

这个 XML 文档携带着某个表格中的信息:

<table xmlns="http://www.w3.org/TR/html4/">
   <tr>
   <td>Apples</td>
   <td>Bananas</td>
   </tr>
</table>

此 XML 文档携带着有关一件家具的信息:

<table xmlns="http://www.w3school.com.cn/furniture">
   <name>African Coffee Table</name>
   <width>80</width>
   <length>120</length>
</table>

命名空间的实际应用

当开始使用 XSL 时,您不久就会看到实际使用中的命名空间。XSL 样式表用于将 XML 文档转换为其他格式,比如 HTML。XSL的英文是eXtensible Stylesheet Language,翻译成中文就是可扩展样式语言

如果您仔细观察下面的这个 XSL 文档,就会看到大多数的标签是HTML标签。非 HTML 的标签都有前缀 xsl,并由此命名空间标示:"http://www.w3.org/1999/XSL/Transform":

<?xml version="1.0" encoding="ISO-8859-1"?>

<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 align="left">Title</th>
      <th 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>

XML CDATA

所有 XML 文档中的文本均会被解析器解析。

只有 CDATA 区段(CDATA section)中的文本会被解析器忽略术语CDATA 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Data,不被解析的数据)

PCDATA

PCDATA 指的是被解析的字符数据(Parsed Character Data)

XML 解析器通常会解析 XML 文档中所有的文本。

当某个 XML 元素被解析时,其标签之间的文本也会被解析:

<message>此文本也会被解析</message>

解析器之所以这么做是因为 XML 元素可包含其他元素,就像这个例子中,其中的 <name> 元素包含着另外的两个元素(first 和 last):

<name><first>Bill</first><last>Gates</last></name>

而解析器会把它分解为像这样的子元素:

<name>
   <first>Bill</first>
   <last>Gates</last>
</name>

CDATA

术语 CDATA 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Data)。

在 XML 元素中,"<" 和 "&" 是非法的。

"<" 会产生错误,因为解析器会把该字符解释为新元素的开始。

"&" 也会产生错误,因为解析器会把该字符解释为字符实体的开始。

某些文本,比如 JavaScript 代码,包含大量 "<" 或 "&" 字符。为了避免错误,可以将脚本代码定义为 CDATA。

CDATA 部分中的所有内容都会被解析器忽略。

CDATA 部分由 "<![CDATA[" 开始,由 "]]>" 结束:

<script>
<![CDATA[
function matchwo(a,b)
{
if (a < b && a < 0) then
  {
  return 1;
  }
else
  {
  return 0;
  }
}
]]>
</script>

在上面的例子中,解析器会忽略 CDATA 部分中的所有内容。

关于 CDATA 部分的注释:

CDATA 部分不能包含字符串 "]]>"。也不允许嵌套的 CDATA 部分。

标记 CDATA 部分结尾的 "]]>" 不能包含空格或折行。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐