xml & w3c - QLGQ/learning-python GitHub Wiki

Introduction

XML被设计用来传输和存储数据,XML是独立于软件和硬件的信息传输工具。

What

XML

  • XML指可扩展标记语言(EXtensible Markup Language);
  • XML是一种标记语言,很类似HTML;
  • XML的设计宗旨是传输数据,而非显示数据;
  • XML标签没有被预定义,需要自行定义标签
  • XML被设计为具有自我描述性
  • XML是W3C的推荐标准

XML vs HTML

  • XML不是HTML的替代,是对HTML的补充;
  • XML和HTML为不同的目的而设计;
  • XML被设计为传输和存储数据,其焦点是数据的内容
  • HTML被设计用来显示数据,其焦点是数据的外观
  • HTML旨在显示信息,而XML旨在传输信息

Additions

XML是不作为的

XML被设计用来结构化、存储以及传输信息。XML不会做任何事情,XML文档仅仅是包装在XML标签中的纯粹的信息,我们需要编写软件或者程序,才能传送、接受和显示出这个文档。

XML仅仅是纯文本

XML 没什么特别的,它仅仅是纯文本而已,有能力处理纯文本的软件都可以处理 XML。不过,能够读懂 XML 的应用程序可以有针对性地处理 XML 的标签。标签的功能性意义依赖于应用程序的特性。

自行定义标签

通过XML,我们可以发明自己的标签,XML允许创作者定义自己的标签和自己的文档结构。而在HTML中是用的标签(以及HTML的结构)是预定义的,HTML文档只使用在HTML标准中定义过的标签(比如<p>、<h1>等等)。

Applications

XML应用于web开发的许多方面,常用于简化数据的存储和共享

  1. XML把数据从HTML分离(通过XML,数据能够存储在独立的XML文件中);
  2. XML简化数据共享(XML数据以纯文本格式进行存储);
  3. XML简化数据传输(通过XML,可以在不兼容的系统之间轻松地交换数据);
  4. XML简化平台的变更(XML数据以文本格式存储);
  5. XML使您的数据更有用(由于XML独立于硬件、软件以及应用程序);
  6. XML用于创建新的Internet语言(eg:XHTML、WSD等)。

Tree Structure

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的版本(1.0)和所使用的编码(ISO-8859-1 = Latin-1/西欧字符集);
  • 第二行描述文档的根元素
  • 第三行到第六行描述根的4个子元素(to, from, heading以及body);
  • 最后一行定义根元素的结尾

XML文档必须包含根元素,该元素是所有其他元素的父元素。
XML文档中的元素形成了一棵文档树,这棵树从根部开始,并扩展到树的最底端。

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

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

父、子以及同胞等术语用于描述元素之间的关系。父元素拥有子元素。相同层级上的子元素成为同胞(兄弟或姐妹)。所有元素均可拥有文本内容和属性(类似 HTML 中)。

Example:

Example

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

Reference

XML

Syntax Rules

  • 所有XML元素都必须有关闭标签
    XML声明没有关闭标签,声明不属于XML本身的组成部分,它不是 XML 元素,也不需要关闭标签。
  • XML标签对大小写敏感
    打开标签和关闭标签通常被称为开始标签和结束标签。
  • XML必须正确地嵌套
<b><i>This text is bold and italic</i></b>           ##正确
<b><i>This text is bold and italic</b></i>           ##错误
  • XML文档必须有根元素
    XML文档必须有一个元素是所有其他元素的父元素,该元素称为根元素
  • XML的属性值须加引号
    • 如果属性值本身包含双引号,那么有必要使用单引号包围它,或者可以使用实体引用。
    • 元数据(有关数据的数据)应当存储为属性,而数据本身应当存储为元素。
    • 请尽量使用元素来描述数据,而仅仅使用属性来提供与数据无关的信息。 与HTML类似,XML也可以拥有属性(名称/值的对),在XML中,XML的属性值须加引号。
<note date="08/08/2008">      ##正确
<to>George</to>
<from>John</from>
</note>

<note date=08/08/2008>      ##错误
<to>George</to>
<from>John</from>
</note>
  • 实体引用
    在XML中,一些字符拥有特殊的意义。如果你把字符 "<" 放在 XML 元素中,会发生错误,这是因为解析器会把它当作新元素的开始。这样会产生XML错误:
<message>if salary < 1000 then</message>

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

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

在XML中,有5个预定义的实体引用: | < | < | 小于 | | > | > | 大于 | | & | & | 和号 | | ' | ' | 单引号 | | " | " | 双引号 |

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

  • XML中的注释
<!-- This is a comment -->
  • 在XML中,空格会被保留;XML以存储换行
    在 Windows 应用程序中,换行通常以一对字符来存储:回车符 (CR) 和换行符 (LF)。这对字符与打字机设置新行的动作有相似之处。在 Unix 应用程序中,新行以 LF 字符存储。而 Macintosh 应用程序使用 CR 来存储新行。

  • XML元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。
    元素可包含其他元素、文本或者两者的混合物,元素也可以拥有属性。

  • XML命名规则:

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

可以使用任何名称,没有保留的字词。

  • 最佳命名习惯

    • 使名称具有描述性。使用下划线的名称也很不错。
    • 名称应当比较简短,比如:<book_title>,而不是:<the_title_of_the_book>。
    • 避免 "-" 字符。如果您按照这样的方式进行命名:"first-name",一些软件会认为你需要提取第一个单词。
    • 避免 "." 字符。如果您按照这样的方式进行命名:"first.name",一些软件会认为 "name" 是对象 "first" 的属性。
    • 避免 ":" 字符。冒号会被转换为命名空间来使用(稍后介绍)。
    • XML 文档经常有一个对应的数据库,其中的字段会对应 XML 文档中的元素。有一个实用的经验,即使用数据库的名称规则来命名 XML 文档中的元素。
    • 非英语的字母比如 éòá 也是合法的 XML 元素名,不过需要留意当软件开发商不支持这些字符时可能出现的问题。
  • XML元素是可扩展的
    XML元素是可扩展的,以携带更多的信息。XML的优势之一,就是可以经常在不中断应用程序的情况下进行扩展。

XML 命名空间

命名冲突

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

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

  • 使用命名空间(Namespaces)
<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>

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

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

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

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

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

默认的命名空间(Default Namespaces)

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

xmlns="namespaceURI"

实例:

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

<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 文档,就会看到大多数的标签是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>
⚠️ **GitHub.com Fallback** ⚠️