除了可以表示結構化和半結構化的數據之外,XML 還有許多其他特性,使其成為一種被廣泛采用的數據表示格式。XML 是可擴展的,與平台無關的,並且由於其完全采用 Unicode 而支持國際化。XML 是基於文本的格式,因此,用戶可以根據需要使用標准的文本編輯工具讀取和編輯 XML 文檔。
XML 的可擴展性表現在多個方面。首先,與 Html 不同,XML 沒有固定的詞匯表。相反,用戶可以使用 XML 定義特定的應用程序或行業專用的詞匯表。其次,與使用其他格式的應用程序相比,處理或使用 XML 格式的應用程序對 XML 結構的更改更具“抵抗力”,只要這些更改是附加的。例如,如果某個應用程序主要處理具有
在交換文檔的過程中,XML 架構可以描述 XML 生成程序與使用程序之間的約定,因為它描述了這二者之間的有效 XML 消息的組成。雖然存在大量用於 XML 的架構語言,從 DTD 到 XDR,但目前最權威的是 W3C XML 架構定義語言,通常簡稱為 XSD。
XSD 在 XML 架構語言中是獨一無二的,因為它最先嘗試擴展 XML 架構的作用,使之不再局限於僅用來描述兩個實體交換文檔時的約定。XSD 引入了“後架構驗證信息集 (Post Schema Validation Infoset,PSVI)”的概念。一個完整的 XSD 處理器接受 XML 信息集作為輸入,並在驗證時將其轉換為後架構驗證信息集 (PSVI)。PSVI 是初始的輸入 XML 信息集,帶有添加的新信息項和添加到現有信息項中的新屬性。W3C XML Schema 推薦列出了後架構驗證的信息集的組成要素。
類型注釋是 PSVI 組成要素中很重要的一類。元素和屬性需進行嚴格的類型定義,並具有與之相關的數據類型信息。經過嚴格類型定義的 XML 有很多用途,可以使用 .NET Framework 的 XmlSerializer 等技術將其映射到對象,可以使用 SQLXML 和 .Net Framework 的 DataSet 技術將其映射到關系表格,或者使用利用了嚴格類型機制的 XML 查詢語言,如 XPath 2.0 和 XQuery 對其進行處理。
以下示例是一個架構片段,描述了 XML 文檔剖析 一節中示例文檔的 items元素。
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="items">
doc.Load("test.XML");
XmlElement firstCD = (XMLElement) doc.DocumentElement.FirstChild;
XMLElement artist =
(XMLElement) firstCD.GetElementsByTagName("artist")[0];
XMLElement title =
(XMLElement) firstCD.GetElementsByTagName("title")[0]
Console.WriteLine("Artist={0}, Title={1}", artist.InnerText, title.InnerText);
}
}
基於游標的 API
XML 游標 API 就像在 XML 文檔中移動的鏡頭,對准被定向的文檔的各個方面。.Net Framework 中的 XPathNavigator 類就是一個 XML 游標 API。XML 游標 API 與樹模型 API 相比,具有不必將整個文檔加載到內存中的優勢,這樣便於對 XML 生成程序中按需生成文檔的部分進行優化。
以下示例使用 .Net Framework 中的 XPathNavigator 類獲取 items元素中第一個 compact-disc的藝術家姓名和標題。
using System;
using System.XML;
using System.XML.XPath;
public class Test{
public static void Main(string[] args){
XmlDocument doc = new XMLDocument();
doc.Load("test.XML");
XPathNavigator nav = doc.CreateNavigator();
nav.MoveToFirstChild(); //從根節點移至文檔元素 (items)
nav.MoveToFirstChild(); //從 items 元素移至第一個 compact-disc 元素
//從 compact-disc 元素移至 artist 元素
nav.MoveToFirstChild();
nav.MoveToNext();
string artist = nav.Value;
//從 artist 元素移至 title 元素
nav.MoveToNext();
string title = nav.Value;
Console.WriteLine("Artist={0}, Title={1}", artist, title);
}
}
流式 API
使用處理 XML 的流式 API 時,用戶只需在內存中存儲要處理的當前節點的上下文,即可處理 XML 文檔。此類 API 可以處理大型的 XML 文件,而不會占用龐大的內容空間。用於 XML 處理的流式 API 主要有兩種類型:基於推進的 XML 分析器和基於拉出的 XML 分析器。
基於推進的分析器(如 SAX)的工作方式是在 XML 數據流中移動,並在遇到 XML 節點時將事件“推進”到已注冊的事件處理程序(回調方法)。基於拉出的分析器(如 .Net Framework 中的 XmlReader 類)則在 XML 數據流中用作只向前的游標。
以下示例使用 .Net Framework 中的 XMLReader 類獲取 items元素中第一個 compact-disc的藝術家姓名和標題。
using System;
using System.XML;
public class Test{
public static void Main(string[] args){
string artist = null, title = null;
XmlTextReader reader = new XmlTextReader("test.XML");
reader.MoveToContent(); //move from root node to document element (items)
/* 保持讀取,直至獲得第一個 <artist> 元素 */
while(reader.Read()){
if((reader.NodeType == XMLNodeType.Element) && reader.Name.Equals("artist")){
artist = reader.ReadElementString();
title = reader.ReadElementString();
break;
}
}
Console.WriteLine("Artist={0}, Title={1}", artist, title);
}
}