DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> XML學習教程 >> XML詳解 >> 了解 XML實現通用的數據訪問
了解 XML實現通用的數據訪問
編輯:XML詳解     
  了解可擴展標記語言 (XML) 如何幫助我們實現通用的數據訪問。XML 是一種基於 Unicode 的純文本元語言,即一種用於定義標記語言的語言。它不依賴於任何編程語言、操作系統或軟件供應商。XML 可以提供對各種數據處理、構建、轉換和查詢技術的訪問。(本文包含一些指向英文站點的鏈接。)  

簡介
   
最初設想的可擴展標記語言 (XML) 用於為 Web 定義新文檔的格式。XML 由標准通用標記語言 (SGML) 衍生而來,可以認為它是一種元語言,即一種定義標記語言的語言。SGML 和 XML 都是基於文本的格式,提供了一種使用標記(文字由‘<’和‘>’括起)描述文檔結構的機制。Web 開發人員可能會注意到,XML 與 Html 有一些相似,這是因為這二者都是由 SGML 衍生而來的。

隨著 XML 的應用日益普及,現在人們已普遍認同,XML 不僅有助於為 Web 描述新文檔的格式,而且也適用於描述結構化的數據。所謂結構化的數據包括那些電子表格、程序配置文件和網絡協議中通常所包含的信息。

XML 要優於早期的數據格式,因為 XML 可以很輕松地表示表格式的數據(如數據庫中的關系數據或電子表格)和半結構化的數據(如 Web 頁面或業務文檔)。早已存在且應用廣泛的一些格式(如逗號分隔值 [CSV] 文件)可以有效地處理表格式數據,卻不能很好地處理半結構化數據,而 RTF 等則只能專門用於半結構化的文本文檔。因此,XML 作為信息交換的通用語言被廣泛接受。

無處不在的 XML
   
除了可以表示結構化和半結構化的數據之外,XML 還有許多其他特性,使其成為一種被廣泛采用的數據表示格式。XML 是可擴展的,與平台無關的,並且由於其完全采用 Unicode 而支持國際化。XML 是基於文本的格式,因此,用戶可以根據需要使用標准的文本編輯工具讀取和編輯 XML 文檔。

XML 的可擴展性表現在多個方面。首先,與 Html 不同,XML 沒有固定的詞匯表。相反,用戶可以使用 XML 定義特定的應用程序或行業專用的詞匯表。其次,與使用其他格式的應用程序相比,處理或使用 XML 格式的應用程序對 XML 結構的更改更具“抵抗力”,只要這些更改是附加的。例如,如果某個應用程序主要處理具有
customer-id
屬性的
<Customer>
元素,如果再向
<Customer>
元素添加一個
last-purchase-date
屬性,該應用程序通常也不會被破壞。這樣的適應性在其他的數據格式中很少見,這也成為使用 XML 的一個顯著優勢。

XML 不依賴於任何編程語言、操作系統或軟件供應商。事實上,使用各種編程語言都可以很容易地生成或使用 XML。而平台獨立性使得 XML 有助於在不同編程平台和操作系統之間實現互操作。

很多人已經意識到將數據發布為 XML 有很多優勢,由此也推動了 XML 數據源的大量應用。人們正在或者已經將業務文檔、數據庫和業務間的通訊等信息源轉換為使用 XML 作為表示格式。Microsoft 的產品,如 Microsoft Office&reg;、Microsoft SQL Server&#8482; 和 Microsoft .Net Framework,都能使最終用戶和開發人員將文檔、網絡信息和其他數據生成為 XML 或作為 XML 使用。

 

XML 1.0 語法
    如前所述,W3C XML 1.0 推薦描述了一種基於文本的格式,使用類似於 Html 的語法來描述結構化和半結構化的數據。

XML 和 Html 的對比 
Html 和 XML 文檔都由元素組成,每個元素都包含一個“起始標記”(例如
<order>
)、一個“結束標記”(例如
</order>
),以及兩個標記之間的信息(指元素的內容)。元素可以使用屬性進行注解,屬性包含了關於元素及其內容的元數據。

但是,HTML 與 XML 之間存在一個顯著的差別,即 XML 區分大小寫,而 Html 不區分大小寫。也就是說,在 XML 中,起始標記
<Table>

<table>
是不同的,而在 HTML 中則是相同的。HTML 與 XML 之間的另一個差別是,XML 引入了“良好結構”的概念。XML 的“良好結構”規則通過強制規定一些規則來消除在處理 Html 等標記語言時存在的一些固有的模糊性,如它強制規定了所有屬性都必須用括號括起,所有元素都必須具有一對起始標記和結束標記,或者明確指出其為空元素。有關良好結構的簡短說明,請參閱“XML FAQ”的 D.2 部分。

HTML 與 XML 之間最顯著的區別在於,HTML 已預先定義了元素和屬性,元素和屬性的行為已完全指定,而 XML 則不是這樣。相反,文檔作者可以創建自己的特定於其應用程序或業務需求的 XML 詞匯表。目前已有的 XML 詞匯表適用於許多行業和應用程序,從財務信息報告 (XBRL)、金融服務 (FpML) 到 Web 文檔 (XHtml)、網絡協議 (SOAP)。由於不必關注那些用來指定如何呈現或顯示 XML 文檔的預定義元素和屬性,因此文檔作者在創建文檔時就可以將重點放在與其特定問題領域相關的語義信息上。XML 詞匯表帶來了內容與形式的分離,使得信息和內容可以得到更大規模的重復利用。

XML 文檔剖析
    以下示例是一個表示音像商店客戶訂單的 XML 文檔。請注意,此文檔既表示了嚴謹的結構化數據(用來描述光盤信息),也表示了半結構化數據(用來說明有關特定顧客的特殊說明和注釋),而其表示方式非常簡單。

<?XML version="1.0" encoding="iso-8859-1" ?>
<?XML-stylesheet href="orders.xsl"?>

<order id="ord123456">
<customer id="cust0921">
  <first-name>Dare</first-name>
  <last-name>Obasanjo</last-name>
  <address>
   <street>One Microsoft Way</street>
   <city>Redmond</city>
   <state>WA</state>
   <zip>98052</zip>
  </address>
</customer>
<items>
  <compact-disc>
   <price>16.95</price>
   <artist>Nelly</artist>
   <title>Nellyville</title>
  </compact-disc>
  <compact-disc>
   <price>17.55</price>
    <artist>Baby D</artist>
    <title>Lil Chopper Toy</title>
  </compact-disc>
</items>

<!-- 要多走幾英裡找到顧客 -->
<special-instrUCtions XMLns:html="http://www.w3.org/1999/xHtml/">
  <Html:p>If customer is not available at the address then attempt
   leave package at one of the following locations listed in order of
   which should be attempted first
  <Html:ol>
   <html:li>Next Door</Html:li>
   <html:li>Front Desk</Html:li>
   <html:li>On Doorstep</Html:li>
  </Html:ol>
  <html:b>Note</Html:b> Remember to leave a note detailing where
   to pick up the package.
  </Html:p>
</special-instructions>
</order>

    文檔的開頭是可選的 XML 聲明,用以指定所使用的 XML 版本,然後是文檔所使用的字符編碼。接下來是 XML 樣式表處理指令,用來綁定樣式表。樣式表中包含的 XML 文檔的格式化指令可以用更生動的方式在用戶應用程序(例如 Web 浏覽器)中呈現 XML 文檔。處理指令通常用來在 XML 文檔中嵌入特定於應用程序的信息。例如,處理以上文檔的大多數應用程序都會忽略 XML 樣式表處理指令,而用於顯示 XML 文檔的應用程序(例如 Web 浏覽器)則會使用處理指令中的信息,以確定將包含了用於顯示文檔的特殊指令的樣式表定位在哪裡。

Photoshop入門教程 Photoshop實例教程 Photoshop cs教程 濾鏡 鼠繪 Photoshop照片處理 Photoshop視頻教程 Photoshop作品展示 特效 摳圖

Unicode + 尖括號 = 互操作
   
XML 1.0 語法是基於文本的,而且可以很容易地進行分析,這使得 XML 在需要跨平台進行交互操作時,成為首選的數據交換格式。在多種常用的操作系統中都可以使用 XML 分析器,因此,不同平台上完全不同的部件在需要共享信息時,可以很容易地進行標准化,采用 XML 作為交換格式。

以 Unicode 為基礎的 XML 也適用於在全球網絡中共享信息,例如在 Web 上。

信息集 (Infoset) 和 XML 系列技術
   
盡管使用 XML 作為數據表示格式可以帶來一個極大的優勢:通過使用基於文本的 XML 語法獲得平台互操作性和可擴展性,但這只是 XML 為應用程序開發人員帶來的益處之一。使用 XML 的另一個主要好處在於,用戶可以訪問各種數據處理、構建、轉換和查詢技術。

XML 信息集
   
W3C XML Information Set 推薦描述了 XML 文檔的抽象表現形式。XML 信息集主要用作各種 XML 技術使用的定義集,以正式描述需要技術處理的 XML 文檔部分。有幾種 W3C XML 技術是按照 XML 信息集進行描述的,包括 SOAP 1.2、XML 架構和 XQuery。

    XML 信息集是 XML 文檔的樹狀層次表示。一個 XML 文檔的信息集包含許多信息項,這些信息項是 XML 文檔組件的抽象表示,其中包括表示文檔、文檔的元素、屬性、處理指令、注釋、字符、表示法、命名空間、未分析的實體、未擴展的實體引用和文檔類型聲明的信息項。XML 信息集是被正式推薦的機制,通過它來定義 XML 文檔中應被重視的重要信息。例如,信息集不區分空元素的兩種形式。因此根據 XML 信息集,以下兩種表示方法

<test></test>
<test/>

是相同的。同樣,屬性所使用的引號類型也不重要,因此根據 XML 信息集,元素

<test attr='value'/>
<test attr="value"/>

是相同的。XML 信息集認為不重要的 XML 1.0 語法內容列表在 W3C XML Information Set 推薦的附錄 D 中提供。

XML Information Set 推薦介紹了“綜合信息集 (Synthetic Infosets)”的概念。所謂綜合信息集是指除使用分析文本形式的 XML 文檔之外還用其他方法創建的信息集。綜合信息集為使用 XML 技術處理非 XML 數據奠定了基礎,當然前提是此類數據可以映射到 XML 信息集。處理綜合信息集的一個示例是 ObjectXPathNavigator,它允許用戶在 .Net Framework 中使用 Xpath 查詢對象,或者使用 XSLT 轉換對象。

 

架構語言 
XML 架構語言用於描述 XML 文檔的結構和內容。例如,可以使用架構指定文檔中包含一個或多個
compact-disc
元素,而每個
compact-disc
元素都包含子元素
price

title

artist
。在交換文檔的過程中,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">
<xs:complexType>
  <xs:sequence>
   <xs:element ref="compact-disc" minOccurs="0" maxOccurs="unbounded" />
  </xs:sequence>
</xs:complexType>
</xs:element>

<xs:element name="compact-disc">
<xs:complexType>
  <xs:sequence>
   <xs:element name="price" type="xs:decimal" />
   <xs:element name="artist" type="xs:string" />
   <xs:element name="title" type="xs:string" />
  </xs:sequence>
</xs:complexType>
</xs:element>

</xs:schema>

基於樹模型的 API
    樹模型 API 將 XML 文檔呈現為由節點組成的樹,這個樹通常可以立即加載到內存中。最常用的 XML 樹模型 API 是 W3C 文檔對象模型 (DOM)。DOM 支持以編程方式讀取、處理和修改 XML 文檔。

以下示例使用 .Net Framework 中的 XMLDocument 類獲取
items
元素中第一個
compact-disc
的藝術家姓名和標題。

using System;
using System.XML;

public class Test{

public static void Main(string[] args){

  XmlDocument doc = new XMLDocument();
  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);
}
}

Photoshop教程 數據結構 五筆輸入法專題 QQ病毒專題 共享上網專題 Google工具和服務專題

 

XML 查詢
    在有些情況下,使用 API 從 XML 文檔中提取信息可能會過於煩瑣,這或者是由於查找數據的條件過於簡略,或者是由於 API 未能呈現用於特定查詢的 XML 文檔的特定內容。XML 查詢語言(如 XPath 1.0 和即將發布的 XQuery)都提供了從 XML 信息集中提取信息的豐富機制。

以下示例顯示了如何使用 XPath 獲取
items
元素中第一個
compact-disc
的藝術家姓名和標題。

using System;
using System.XML.XPath;

public class Test{

public static void Main(string[] args){
  
  XPathDocument doc  = new XPathDocument("test.XML");
  XPathNavigator nav = doc.CreateNavigator();

  XPathNodeIterator iterator = nav.Select("/items/compact-disc[1]/artist /items/compact-disc[1]/title");

  iterator.MoveNext();
  Console.WriteLine("Artist={0}", iterator.Current);

  iterator.MoveNext();
  Console.WriteLine("Title={0}", iterator.Current);

}
}

XML 轉換
    用戶經常需要將 XML 文檔從一個詞匯表轉換到另一個詞匯表。這樣做有時是為了以便於打印的格式或在 Web 浏覽器中呈現文檔,有時是可能需要將從外部實體接收的文檔轉換為較為熟悉的格式。

    XSLT 是一種優秀的 XML 轉換語言。XSLT 中闡述的轉換說明了將源樹轉換為結果樹的規則。轉換通過關聯模式和模板來完成。一個模式是一個 XPath 表達式,可以將其視為與 XML 源樹的部分相匹配的正則表達式,與字符串的匹配部分相對。模式與源樹中的元素進行匹配。成功匹配後,模板成為創建結果樹部分的例示。在構建結果樹時,可以對源樹中的元素進行篩選和重新排序,還可以添加任意結構。

以下 XSLT 樣式表將
items
元素轉換為包含光盤信息表的 XHtml Web 頁。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" XMLns="http://www.w3.org/1999/xHtml">

<xsl:output method="XML" indent="yes"
  doctype-system="http://www.w3.org/TR/xhtml1/DTD/xHtml1-transitional.dtd"
  doctype-public="-//W3C//DTD XHtml 1.0 Transitional//EN" />


  <xsl:template match="/">

  <Html lang="en" XML:lang="en">
   <head>
   <title>Order Information - ord123456</title>
   </head>
   <body>
    <table border="1">
    <tr><th>Artist</th><th>Title</th><th>Price</th></tr>

    <xsl:for-each select="items/compact-disc">
    <tr>
    <td><xsl:value-of XMLns="" select="artist" /></td>
    <td><xsl:value-of XMLns="" select="title" /></td>
    <td><xsl:value-of XMLns="" select="price" /></td>
    </tr>
    </xsl:for-each>

 </table>
   </body>  
  </Html>
  
  </xsl:template>

</xsl:stylesheet>

XHtml 文檔由如下所示的樣式表生成:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xHtml1-transitional.dtd">
<html lang="en" xml:lang="en" XMLns="http://www.w3.org/1999/xHtml">
<head>
  <title>Order Information - ord123456</title>
</head>
<body>
  <table border="1">
   <tr>
    <th>Artist</th>
    <th>Title</th>
    <th>Price</th>
   </tr>
   <tr>
    <td>Nelly</td>
    <td>Nellyville</td>
    <td>16.95</td>
   </tr>
   <tr>
    <td>Baby D</td>
    <td>Lil Chopper Toy</td>
    <td>17.55</td>
   </tr>
  </table>
</body>
</Html>

它在 Web 浏覽器中如下所示。

Artist Title Price
Nelly Nellyville 16.95
Baby D Lil Chopper Toy 17.55

小結
    XML 不僅是一種描述文檔的文本格式,還是一種描述結構化和半結構化數據的機制,提供了處理此類數據所需的一系列技術。像 XML 信息集等強大的提取功能將幫助我們使用 XML 技術更好地處理非文本數據,如文件系統、Windows&reg; 注冊表、關系數據庫,甚至是編程語言對象。XML 使我們向實現通用的數據訪問又邁進了一步。

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved