XML

文章目录

  • XML概述
  • XML语法规则
  • XML元素命名规则
  • 尽量避免使用属性
  • 针对元数据的 XML 属性
  • XML 错误会终止您的程序
  • 为什么 XML 显示这个样子?
      • 使用 CSS 显示 XML
      • 使用 XSLT 显示 XML
      • 使用JavaScript显示XML
          • XMLHttpRequest 对象
          • 创建一个 XMLHttpRequest 对象
          • XML解析器
          • XML DOM
          • 在 HTML 页面中显示 XML 数据
          • 点击CD时显示专辑信息
  • CDATA - (未解析)字符数据
  • XML编码
  • 服务器上的 XML
  • XML应该避免的技术
      • Internet Explorer - XML 数据岛
      • Internet Explorer - 行为
  • XML相关技术
  • XML编辑器:XMLSpy
  • XML E4X
      • E4X 向 JavaScript 添加了对 XML 的直接支持。
      • 作为一个 JavaScript 对象的 XML
      • E4X 是一个 ECMAScript(JavaScript)标准
      • 使用E4X和未使用E4X的区别
      • 浏览器支持
  • XML总结
  • 学习展望

XML概述

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

如下例子:


Tove
Jani
Reminder
Don't forget me this weekend!

上面实例中的标签没有在任何 XML 标准中定义过(比如 和 )。这些标签是由 XML 文档的创作者发明的。这是因为 XML 语言没有预定义的标签。HTML 中使用的标签都是预定义的。HTML 文档只能使用在 HTML 标准中定义过的标签(如

等等)。XML 允许创作者定义自己的标签和自己的文档结构。

XML语法规则

  • XML 声明文件的可选部分,如果存在需要放在文档的第一行,如下所示:

  • XML 文档必须有根元素

  • 所有的 XML 元素都必须有一个关闭标签

  • XML 标签对大小写敏感

  • XML 必须正确嵌套

  • XML 属性值必须加引号

  • 实体引用

    引用 实体 含义
    < < less than
    > > greater than
    & & ampersand
    ' apostrophe
    " " quotation mark
  • 在 XML 中,空格会被保留

XML元素命名规则

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

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

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

尽量避免使用属性

因使用属性而引起的一些问题:

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

属性难以阅读和维护。请尽量使用元素来描述数据。而仅仅使用属性来提供与数据无关的信息。

不要做这样的蠢事(这不是 XML 应该被使用的方式):


	

针对元数据的 XML 属性

有时候会向元素分配 ID 引用。这些 ID 索引可用于标识 XML 元素,它起作用的方式与 HTML 中 id 属性是一样的。这个实例向我们演示了这种情况:



Tove
Jani
Reminder
Don't forget me this weekend!


Jani
Tove
Re: Reminder
I will not


上面的 id 属性仅仅是一个标识符,用于标识不同的便签。它并不是便签数据的组成部分。

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

XML 错误会终止您的程序

XML 文档中的错误会终止您的 XML 应用程序。

W3C 的 XML 规范声明:如果 XML 文档存在错误,那么程序就不应当继续处理这个文档。理由是,XML 软件应当轻巧,快速,具有良好的兼容性。

如果使用 HTML,创建包含大量错误的文档是有可能的(比如您忘记了结束标签)。其中一个主要的原因是 HTML 浏览器相当臃肿,兼容性也很差,并且它们有自己的方式来确定当发现错误时文档应该显示为什么样子。

使用 XML 时,这种情况不应当存在。

可以通过XML DTD或者XML Schema来验证XML

为什么 XML 显示这个样子?

XML 文档不会携带有关如何显示数据的信息。

由于 XML 标签由 XML 文档的作者"发明",浏览器无法确定像

这样一个标签究竟描述一个 HTML 表格还是一个餐桌。

在没有任何有关如何显示数据的信息的情况下,大多数的浏览器都会仅仅把 XML 文档显示为源代码

在下面的章节,我们会了解几个有关这个显示问题的解决方案,其中会使用 CSS、XSLT 和 JavaScript。

使用 CSS 显示 XML

引入css样式表:

使用 CSS 格式化 XML 不是常用的方法。W3C 推荐使用 XSLT.

使用 XSLT 显示 XML

  • XSLT 是首选的 XML 样式表语言。

  • XSLT(eXtensible Stylesheet Language Transformations)远比 CSS 更加完善。

  • XSLT 是在浏览器显示 XML 文件之前,先把它转换为 HTML:

  • 当浏览器读取 XML 文件时,XSLT 转换是由浏览器完成的。在使用 XSLT 来转换 XML 时,不同的浏览器可能会产生不同结果。为了减少这种问题,可以在服务器上进行 XSLT 转换。

使用JavaScript显示XML

XMLHttpRequest 对象

XMLHttpRequest 对象用于在后台与服务器交换数据。

XMLHttpRequest 对象是开发者的梦想,因为您能够:

  • 在不重新加载页面的情况下更新网页
  • 在页面已加载后从服务器请求数据
  • 在页面已加载后从服务器接收数据
  • 在后台向服务器发送数据
创建一个 XMLHttpRequest 对象

所有现代浏览器(IE7+、Firefox、Chrome、Safari 和 Opera)都有内建的 XMLHttpRequest 对象。

  • 创建 XMLHttpRequest 对象的语法:
    xmlhttp=new XMLHttpRequest();

  • 旧版本的Internet Explorer(IE5和IE6)中使用 ActiveX 对象:
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");

XML解析器

XML 解析器把 XML 文档转换为 XML DOM 对象 - 可通过 JavaScript 操作的对象。

  • 解析 XML 文档:下面的代码片段把 XML 文档解析到 XML DOM 对象中:

    if (window.XMLHttpRequest)
    {// code for IE7+, Firefox, Chrome, Opera, Safari
    xmlhttp=new XMLHttpRequest();
    }
    else
    {// code for IE6, IE5
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.open("GET","books.xml",false);
    xmlhttp.send();
    xmlDoc=xmlhttp.responseXML;
    
  • 解析 XML 字符串:下面的代码片段把 XML 字符串解析到 XML DOM 对象中:

    txt="";
    txt=txt+"Everyday Italian";
    txt=txt+"Giada De Laurentiis";
    txt=txt+"2005";
    txt=txt+"";
    
    if (window.DOMParser)
    {
    parser=new DOMParser();
    xmlDoc=parser.parseFromString(txt,"text/xml");
    }
    else // Internet Explorer
    {
    xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
    xmlDoc.async=false;
    xmlDoc.loadXML(txt);
    }
    

    注释:Internet Explorer 使用 loadXML() 方法来解析 XML 字符串,而其他浏览器使用 DOMParser 对象。

  • 出于安全方面的原因,现代的浏览器不允许跨域的访问。这意味着,网页以及它试图加载的 XML 文件,都必须位于相同的服务器上。

XML DOM

DOM(Document Object Model 文档对象模型)定义了访问和操作文档的标准方法。

XML DOM(XML Document Object Model)定义了访问和操作 XML 文档的标准方法。

XML DOM 把 XML 文档作为树结构来查看。

所有元素可以通过 DOM 树来访问。可以修改或删除它们的内容,并创建新的元素。元素,它们的文本,以及它们的属性,都被认为是加载一个 XML 文件 - 跨浏览器实例

  • 下面的实例把 XML 文档(“note.xml”)解析到 XML DOM 对象中,然后通过 JavaScript 提取一些信息:

    
    
    

    W3Schools Internal Note

    To:
    From:
    Message:
  • 加载一个 XML 字符串 - 跨浏览器实例

    下面的实例把 XML 字符串解析到 XML DOM 对象中,然后通过 JavaScript 提取一些信息:

    
    
    

    W3Schools Internal Note

    To:
    From:
    Message:
在 HTML 页面中显示 XML 数据
  • 在下面的实例中,我们打开一个 XML 文件(“cd_catalog.xml”),然后遍历每个 CD 元素,并显示HTML 表格中的 ARTIST 元素和 TITLE 元素的值:
    
    
    
    
    
    
    
    
点击CD时显示专辑信息







Click on a CD to display album information.

CDATA - (未解析)字符数据

  • 术语 CDATA 是不应该由 XML 解析器解析的文本数据。

  • 像 “<” 和 “&” 字符在 XML 元素中都是非法的:

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

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

  • 某些文本,比如 JavaScript 代码,包含大量 “<” 或 “&” 字符。为了避免错误,可以将脚本代码定义为 CDATA。CDATA 部分中的所有内容都会被解析器忽略。

  • CDATA 部分由 “” 结束:

    
    

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

  • 关于 CDATA 部分的注释

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

    标记 CDATA 部分结尾的 “]]>” 不能包含空格或换行。

XML编码

XML 文档可以包含非 ASCII 字符,比如挪威语 æ ø å,或者法语 ê è é。为了避免错误,需要规定 XML 编码,或者将 XML 文件存为 Unicode。

  • 始终使用编码属性
  • 使用支持编码的编辑器
  • 确保您知道编辑器使用什么编码
  • 在您的编码属性中使用相同的编码

服务器上的 XML

  • 通过 ASP 生成 XML

    XML 可在不安装任何 XML 软件的情况下在服务器端生成。 如需从服务器生成 XML 响应 - 只需简单地编写以下代码并在 Web 服务器上把它保存为一个 ASP 文件:

    <%
    response.ContentType="text/xml"
    response.Write("")
    response.Write("")
    response.Write("Jani")
    response.Write("Tove")
    response.Write("Remember me this weekend")
    response.Write("")
    %>
    

    请注意,此响应的内容类型必须设置为 “text/xml”。

  • 通过 PHP 生成 XML

    如需使用 PHP 从服务器上生成 XML 响应,请使用下面的代码:

    ";
    echo "";
    echo "Jani";
    echo "Tove";
    echo "Remember me this weekend";
    echo "";
    ?>
    

    请注意,响应头部的内容类型必须设置为 “text/xml”。

  • 从数据库生成 XML

    XML 可在不安装任何 XML 软件的情况下从数据库生成。 如需从服务器生成 XML 数据库响应,只需简单地编写以下代码,并把它在 Web 服务器上保存为 ASP 文件:

    <%
    response.ContentType = "text/xml"
    set conn=Server.CreateObject("ADODB.Connection")
    conn.provider="Microsoft.Jet.OLEDB.4.0;"
    conn.open server.mappath("/db/database.mdb")
    
    sql="select fname,lname from tblGuestBook"
    set rs=Conn.Execute(sql)
    
    response.write("")
    response.write("")
    while (not rs.EOF)
    response.write("")
    response.write("" & rs("fname") & "")
    response.write("" & rs("lname") & "")
    response.write("")
    rs.MoveNext()
    wend
    
    rs.close()
    conn.close()
    response.write("")
    %>
    
  • 在服务器上通过 XSLT 转换 XML

    下面的 ASP 代码在服务器上把 XML 文件转换为 XHTML:

    <%
    'Load XML
    set xml = Server.CreateObject("Microsoft.XMLDOM")
    xml.async = false
    xml.load(Server.MapPath("simple.xml"))
    
    'Load XSL
    set xsl = Server.CreateObject("Microsoft.XMLDOM")
    xsl.async = false
    xsl.load(Server.MapPath("simple.xsl"))
    
    'Transform file
    Response.Write(xml.transformNode(xsl))
    %>
    

    实例解释:

    • 第一个代码块创建微软 XML 解析器的实例(XMLDOM),并把 XML 文件载入内存。
    • 第二个代码块创建解析器的另一个实例,并把 XSL 文件载入内存。
    • 最后一个代码使用 XSL 文档来转换 XML 文档,并把结果以 XHTML 发送到您的浏览器。
  • 通过 ASP 把 XML 保存为文件

    这个 ASP 实例会创建一个简单的 XML 文档,并把该文档保存到服务器上:

    <%
    text=""
    text=text & "Tove"
    text=text & "Jani"
    text=text & "Reminder"
    text=text & "Don't forget me this weekend!"
    text=text & ""
    
    set xmlDoc=Server.CreateObject("Microsoft.XMLDOM")
    xmlDoc.async=false
    xmlDoc.loadXML(text)
    
    xmlDoc.Save("test.xml")
    %> 
    

XML应该避免的技术

Internet Explorer - XML 数据岛

  • 它是什么?XML 数据岛是嵌入到 HTML 页面中的 XML 数据。

  • 为什么要避免使用它?XML 数据岛只在 Internet Explorer 浏览器中有效。

  • 用什么代替它?您应当在 HTML 中使用 JavaScript 和 XML DOM 来解析并显示 XML。

  • 实例:

    把 XML 文档绑定到 HTML 文档中的一个 标签。id 属性定义数据岛的标识符,而 src 属性指向 XML 文件:

    本实例只适用于 IE 浏览器

    
    
    
    
    
    

标签的 datasrc 属性把 HTML 表格绑定到 XML 数据岛。

标签允许 datafld 属性引用要显示的 XML 元素。在这个实例中,要引用的是 “ARTIST” 和 “TITLE”。当读取 XML 时,会为每个 元素创建相应的表格行。

Internet Explorer - 行为

  • 它是什么?Internet Explorer 5 引入了行为。行为是通过使用 CSS 样式向 XML (或 HTML )元素添加行为的一种方法。

  • 为什么要避免使用它?只有 Internet Explorer 支持 behavior 属性。

  • 使用什么代替它?使用 JavaScript 和 XML DOM(或 HTML DOM)来代替它。

  • 实例 - 鼠标悬停突出:

    下面的 HTML 文件中的

    Mouse over me!!!

    下面显示的是 XML 文档 “behave.htc”(该文件包含了一段 JavaScript 和针对元素的事件句柄):

    
    
    
     
    

XML相关技术

  • XHTML (可扩展 HTML)
    更严格更纯净的基于 XML 的 HTML 版本。

  • XML DOM (XML 文档对象模型)
    访问和操作 XML 的标准文档模型。

  • XSL (可扩展样式表语言) XSL 包含三个部分:

    • XSLT (XSL 转换) - 把 XML 转换为其他格式,比如 HTML
    • XSL-FO (XSL 格式化对象)- 用于格式化 XML 文档的语言
    • XPath - 用于导航 XML 文档的语言
  • XQuery (XML 查询语言)
    基于 XML 的用于查询 XML 数据的语言。

  • DTD (文档类型定义)
    用于定义 XML 文档中的合法元素的标准。

  • XSD (XML 架构)
    基于 XML 的 DTD 替代物。

  • XLink (XML 链接语言)
    在 XML 文档中创建超级链接的语言。

  • XPointer (XML 指针语言)
    允许 XLink 超级链接指向 XML 文档中更多具体的部分。

  • SOAP (简单对象访问协议)
    允许应用程序在 HTTP 之上交换信息的基于 XML 的协议。

  • WSDL (Web 服务描述语言)
    用于描述网络服务的基于 XML 的语言。

  • RDF (资源描述框架)
    用于描述网络资源的基于 XML 的语言。

  • RSS (真正简易聚合)
    聚合新闻以及类新闻站点内容的格式。

  • SVG (可伸缩矢量图形)
    定义 XML 格式的图形。

XML编辑器:XMLSpy

  • 在 32 位和 64 位版本中可用
  • 使用方便
  • 上下文敏感的人们帮手
  • 语法着色和漂亮的印刷
  • 智能修复验证与自动校正错误
  • 文本视图和网格视图之间轻松切换
  • 图形化的 XML Schema 编辑器
  • 所有主流数据库的数据库导入导出
  • SharePoint® 服务器支持
  • 内置许多 XML 文档类型的模板
  • 显示 XML 数据的图表创建
  • XPath 1.0/2.0 的智能自动完成
  • XSLT 1.0/2.0 编辑器、分析器和调试器
  • XQuery 编辑器、分析器和调试器
  • SOAP 客户端和调试器
  • 图像化的 WSDL 1.1/2.0 编辑器
  • XBRL 验证 & 分类编辑
  • 支持 Office 2007 / OOXML
  • Java、C++ 和 C# 的代码生成
  • HTML5 和 CSS3 支持

XML E4X

E4X 向 JavaScript 添加了对 XML 的直接支持。

该实例仅仅适用于Firefox:




This example works in Firefox only.

作为一个 JavaScript 对象的 XML

E4X 是正式的 JavaScript 标准,增加了对 XML 的直接支持。

使用 E4X,您可以用声明 Date 或 Array 对象变量的方式声明 XML 对象变量:

var x = new XML()

var y = new Date()

var z = new Array()

E4X 是一个 ECMAScript(JavaScript)标准

ECMAScript 是 JavaScript 的正式名称。ECMA-262(JavaScript 1.3)是在 1999 年 12 月标准化的。

E4X 是 JavaScript 的扩展,增加了对 XML 的直接支持。ECMA-357(E4X)是在 2004 年 6 月标准化的。

ECMA 组织(成立于 1961 年),是专门用于信息和通信技术(ICT)和消费电子(CE)的标准化。 ECMA 制定的标准为:

JavaScript
C# 语言
国际字符集
光盘
磁带
数据压缩
数据通信
等等...

使用E4X和未使用E4X的区别

  • 没有使用 E4X

    下面的实例是一个跨浏览器的实例,实例加载一个现有的 XML 文档(“note.xml”)到 XML 解析器,并显示消息说明:
    实例

    var xmlDoc;
    //code for Internet Explorer
    if (window.ActiveXObject)
    {
    xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
    xmlDoc.async=false;
    xmlDoc.load("note.xml");
    displaymessage();
    }
    // code for Mozilla, Firefox, etc.
    else (document.implementation && document.implementation.createDocument)
    {
    xmlDoc= document.implementation.createDocument("","",null);
    xmlDoc.load("note.xml");
    xmlDoc.onload=displaymessage;
    }
    
    function displaymessage()
    {
    document.write(xmlDoc.getElementsByTagName("body")[0].firstChild.nodeValue);
    }
    
  • 使用 E4X

    下面的实例是上面的实例相同,但是使用了 E4X:

    var xmlDoc=new XML();
    xmlDoc.load("note.xml");
    document.write(xmlDoc.body);
    

浏览器支持

Firefox 是目前唯一对 E4X 的支持比较好的浏览器。

目前还没有支持 E4X 的有 Opera、Chrome 或 Safari。

到目前为止,没有迹象显示在 Internet Explorer 中对 E4X 的支持。
E4X 的未来

E4X 没有得到广泛的支持。也许它提供的实用功能太少,尚未被其他的解决方案涉及:

  • 对于完整的 XML 处理,您还需要学习 XML DOM 和 XPath
  • 对于访问 XMLHttpRequests,JSON 是首选的格式。
  • 对于简单的文档处理,JQuery 选择更容易。

XML总结

  • XML 可用于交换、共享和存储数据。

  • XML 文档形成 树状结构,在"根"和"叶子"的分支机构开始的。

  • XML 有非常简单的 语法规则。带有正确语法的 XML 是"形式良好"的。有效的 XML 是针对 DTD 进行验证的。

  • XSLT 用于把 XML 转换为其他格式,比如 HTML。

  • 所有现代的浏览器有一个内建的 XML 解析器,可读取和操作 XML。

  • DOM(Document Object Model)定义了一个访问 XML 的标准方式。

  • XMLHttpRequest 对象提供了一个网页加载后与服务器进行通信的方式。

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

  • CDATA 区域内的文本会被解析器忽略。

学习展望

  • 推荐学习 XML DOM 和 XSLT。

  • 如果您想要学习有关验证 XML 的知识,我们推荐学习 DTD 和 XML Schema。

  • 下面是每个主题的一个简短描述。

    • XML DOM(Document Object Model)

      • XML DOM 定义了一种访问和处理 XML 文档的标准方式。

      • XML DOM 是平台和语言独立的,可用于任何编程语言,如 Java、JavaScript 和 VBScript。

    • XSLT(XML 样式表语言转换)

      • XSLT 是 XML 文件的样式表语言。

      • 通过使用 XSLT,可以把 XML 文档转换为其他格式,比如 XHTML。

    • XML DTD(文档类型定义)

      • DTD 的目的是定义 XML 文档中合法的元素、属性和实体。

      • 通过使用 DTD,每个 XML 文件可以随身携带它自己的格式的描述。

      • DTD 可以被用来确认您收到的数据和您自己的数据是否有效。

    • XML Schema

      • XML Schema 是一种基于 XML 的 DTD 替代。

      • 不像 DTD,XML Schema 支持数据类型,且使用 XML 语法。

你可能感兴趣的:(前端,XML)