跳至內容

XML/單一實體

本頁使用了標題或全文手工轉換
維基教科書,自由的教學讀本
< XML

XML > 單一實體


學習目標

[編輯]

完成本章內容的學習,對於一個實體您將能夠

  • 建立一個XML資料schema
  • 建立一個XML文件; 文档=>zh-mo:文件
  • 建立一個XML樣式表
  • 編寫一段java程式來解析一個XML文件; 文档=>zh-mo:文件並列出其中的內容

概述

[編輯]
許多電腦; 计算机=>zh-mo:電腦系統中都會包含有格式不一資料。在這樣的系統之間進行資料格式的轉換將會耗費大量的時間。XML是一種通用的資料儲存格

式,而與之相配套的大量工具和技術能夠使得不相容的系統之間特定XML應用的交換變得十分簡捷。由於XML的開放性和通用性,可以預見 的是隨着時間的發展,越來越多的組織和個人包括程式設計師和資料用戶都將會選擇XML。這將使得XML最終成為對於特定資料交換的最可行的 技術。

XML不僅僅是被用來進行資訊的交換,其也能用於網頁的發布。XML的語法非常嚴謹,從而使得網頁瀏覽器變得體積更小、速度更快成為可

能,同時其也能很好地應用於個人數字助理(DA)和手機上。而在另一方面,為讀取HTML格式網頁而設計的瀏覽器,往往必須設計大量的 代碼來解決由於HTML缺乏對於資料格式的嚴格定義而造成的不便。

適用於以XML方式進行編碼的資料類型應該具有以下特點:域長度是未知的和不可預見的,這裏域的內容大多數為純文字; 文本=>zh-mo:文字。
XML schema 允許以標準化結構進行資訊交換。 Schema定義了一些自訂的標記,這些標記包含有許多用以描述標記所標識內容的屬

性。這樣,XML文件; 文档=>zh-mo:文件中被標記的資料中所包含的資訊便可以通過一種名叫「解析器」的應用程式進行提取,更進一步,利用XML樣式表便可以轉 換為Web網頁格式。

建立schema的第一步便是定義描述資料交換中所涉及事實的資料模型。當具有高置信度的模型一旦被建立,資料模型便可以轉換成為

schema。在本章內容中,我們將從一個簡單的例子開始,在其後的章節中將會陸續介紹XML其他更加複雜的屬性。

如下圖所示,我們將會從一個單一的實體CITY開始。由於本章討論的是將單一的實體CITY對映到XML schema的問題,我們需要定義一個

包含CITY的實體TOURGUIDE。我們可以將TOURGUIDE想像成為一個包含有許多城市的實體,並且TOURGUIDE將不包含任何屬性或是標 簽。TOURGUIDE將僅僅是一個城市相關資料的集合。

Single Entity - City

XML schema

[編輯]

XML schema 描述了XML文件; 文档=>zh-mo:文件的結構和內容,其定義了:

  • 出現在一個文件; 文档=>zh-mo:文件中的所有元素的名稱和內容;
  • 文件; 文档=>zh-mo:文件的結構;
  • 所有的子元素;
  • 子元素的數目;
  • 元素出現的頻率;
  • 元素出現的順序;
  • 元素的資料類型.
XML schema的一個突出的優點是它定義了資料類型,使得對於符合該Schema的文件; 文档=>zh-mo:文件的內容描述和資料正確性的校驗變得更加容易。這樣

一來,文件; 文档=>zh-mo:文件中可能包含的錯誤就能夠在進行資料交換之前被檢測出。

XML schema語言被稱為XML schema 定義(XSD)。因為XML schema也是用XML編寫的,所以它是可延伸的,而且XML文件; 文档=>zh-mo:文件的編輯器

可同樣用於XML schema的編輯。

通用XML schema資料類型

XML schema有許多預定義的資料類型。最為通用的有:

  • 字串型——元素中包含有一串字元
  • 十進制型——元素中包含有十進制小數
  • 整型——元素中包含有整數
  • 布林型——元素中包含有真/假或1/0
  • 日期型——元素中包含有日期
  • 時間型——元素中包含有時間
  • uri參照型——元素中包含有URL(統一資源定位符)
完整的預定義資料結構列表請參http://www.w3.org/TR/xmlschema-2/#built-in-datatypes
schema元素的定義有兩種類型:簡單或複雜。一個「簡單類型」將只包含「文字; 文本=>zh-mo:文字」而不會有其他元素或屬性。在這裏,「文字; 文本=>zh-mo:文字」是一個概括的表示,其含義是預定義的資料類型或來源於用戶自訂的類型定義。一個「複雜類型」包含有其他的元素或屬性。無論簡單還是複雜的類型都可以進行命名,以便能夠在schema的其他部分進行重用;如果不對該類型命名,則該類型只有在給出定義的元素下才能被使用。


<xsd:element name="city" type="cityDetails">
<xsd:complexType name="cityDetails">
<xsd:sequence>
<xsd:element name="cityName" type="xsd:string"/>
<xsd:element name="adminUnit" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

圖2-1 命名的複雜類型


<xsd:element name="tourGuide">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="city" type="cityDetails"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>

圖2-2 未命名的複雜類型


<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified">
<!-- Tour Guide -->
<xsd:element name="tourGuide">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="city" type="cityDetails" minOccurs = "1" maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<!-- City -->
<xsd:complexType name="cityDetails">
<xsd:sequence>
<xsd:element name="cityName" type="xsd:string"/>
<xsd:element name="adminUnit" type="xsd:string"/>
<xsd:element name="country" type="xsd:string"/>
<xsd:element name="population" type="xsd:integer"/>
<xsd:element name="area" type="xsd:integer"/>
<xsd:element name="elevation" type="xsd:integer"/>
<xsd:element name="longitude" type="xsd:decimal"/>
<xsd:element name="latitude" type="xsd:decimal"/>
<xsd:element name="description" type="xsd:string"/>
<xsd:element name="history" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>

表2-1 City實體的XML schema – city.xsd


讓我們檢查一下上面的XML schema

  • 所有的XML文件; 文档=>zh-mo:文件都以XML聲明開始{1}。
  • XSD schema 命名空間namespace 聲明 {2}. 命名空間將會在《資料schema》[[Data schemas

(XML) | Data schemas]] 章節中深入地討論。

  • 註釋被包含在標籤「&lt!--「和「--&gt」 之間{3}.
  • tourGuide元素被定義為一個複雜類型{4-10},也就是說其中包含嵌入的元素。
  • 一個元素最少出現次數通過minOccurs(預設值為1)進行定義,最大出現次數沒有限制maxOccurs=「無窮大」{7}
  • City被聲明為已命名的複雜類型{7}。
  • <xsd:complexType 標誌了一個複雜類型聲明的開始{12},」cityDetails」 標識了這個複雜類型。但是這不是該

複雜類型的名稱。這種複雜類型定義可以用來對於多個元素進行聲明。

  • Schema元素sequence {13} 定義了子元素出現的次序。
  • <xsd:element 標誌了一個簡單類型聲明的開始{14}。」cityName」 是這個被聲明的元素的名稱(在XML文件; 文档=>zh-mo:文件中通常

以<cityName>的形式出現)」xsd:string」 是這個元素的資料類型。

  • 結束標誌{24-26}。注意:結束標誌不能相互交疊。
  • 注意: 緯度和經度是十進制資料類型。從通常形式(例如50º 17' 35")到十進制形式的轉換可通過公式度+分/60+秒/3600。
對於任何XML文件; 文档=>zh-mo:文件,包括XML schema和XML 樣式表文件; 文档=>zh-mo:文件,都可以進行檢查以判定它們是否「結構良好」(良構)。正如第一

章所描述的,一個符合XML語法規則的XML文件; 文档=>zh-mo:文件就是良構的文件; 文档=>zh-mo:文件,即有且只有唯一的一個根元素,任何開始標籤必須有一個結 束標籤與之對應。我們可使用XML編輯軟件來進行結構良好性檢驗,例如NetBeans。

一旦檢查到錯誤,這些錯誤將會按順序顯示在結果窗口中。雙擊任何一個錯誤報告,便可以轉到XML文件; 文档=>zh-mo:文件中該錯誤出現的位置。

可以使用NetBeans建立上述XML schema:

  1. 點擊File -> New -> XML -> XML Schema。
  2. 將檔案儲存; 保存=>zh-mo:儲存為「city」(將自動添加字尾.xsd)。
  3. 複製並貼上上述schema到檔案city.xsd中並儲存; 保存=>zh-mo:儲存。

檢查XML文件; 文档=>zh-mo:文件是否為良構的:

  1. 右鍵單擊文件; 文档=>zh-mo:文件節點,選擇Check XML document 或按Alt+F9。

如果XML schema city.xsd是良構的,輸出窗口將如下所示: Well Form XML Document


小結:XML schema 顯示了XML文件; 文档=>zh-mo:文件的元素和結構

XML文件; 文档=>zh-mo:文件

[編輯]
XML文件; 文档=>zh-mo:文件是包含有XML代碼和句法的檔案。所有的XML文件; 文档=>zh-mo:文件必須包含有唯一一對標識"根"元素的標籤。所有其他元素都必須包

含在這個根元素中。元素可以擁有子元素。相對應的,任意子元素都有一個「父」元素。所有的元素都必須正確地巢狀在它們的父元素中,也就是子元素的結束標籤一定要在父元素結束標籤前給出。這樣便形成了一個樹狀的結構。XML文件; 文档=>zh-mo:文件以.xml為後 綴。

XML元素命名規定

XML元素的名稱必須以字母或帶底線的字元開頭。而且也不能以字串「xml」開頭,「xml」是XML定義保留的字串。

名稱的其他部分可以是字母、數字或其他字元但中間不能存在空格。理論上講可以給元素定義任意名稱,但是為了增強元素名的描述性,名稱最好能夠反映該元素的所表示的內容。

XML文件; 文档=>zh-mo:文件通常會有一個相對應的數據庫,在該數據庫中欄位與XML文件; 文档=>zh-mo:文件中的元素相對應。一個很好的方式是使用數據庫中的命

名規則來進行XML文件; 文档=>zh-mo:文件元素的命名。

「:」儘量不要用在元素的名稱之中。因為其是被保留用來進行命名空間的定義(這一部分將會在下一章中詳細介紹)
<?xml version="1.0" encoding="UTF-8"?>
<tourGuide
     xmlns:xsi='http://www.w3.org/1/XMLSchema-instance'
     xsi:noNamespaceSchemaLocation='city.xsd'>
	<city>
		<cityName>Belmopan</cityName>
		<adminUnit>Cayo</adminUnit>
		<country>Belize</country>
		<population>
		/population>
		<area>
		5
		</area>
		<elevation></elevation>
		<longitude>
		/longitude>
		<latitude>
		/latitude>
		<description>Belmopan is the capital of Belize</description>
		<history>Belmopan was established following the devastation of the former capitol,
			Belize City, by Hurricane Hattie in 5. High ground and open space influenced the 
			choice and ground-breaking began in 6.  By 0 most government offices and
			operations had already moved to the new location.</history>
	</city>
	<city>
		<cityName>Kuala Lumpur</cityName>
		<adminUnit>Selangor</adminUnit>
		<country>Malaysia</country>
		<population>0</population>
		<area>
		</area>
		<elevation></elevation>
		<longitude>
		./longitude>
		<latitude>
		3./latitude>
		<description>Kuala Lumpur is the capital of Malaysia and the largest city in the nation</description>
		<history>The city was founded in 7 by Chinese tin miners and superseded Klang.  In
			0 the British government transferred their headquarters from Klang to Kuala Lumpur, 
			and in 6 it became the capital of Malaysia. </history>
	</city>
</tourGuide>

表2-2 City 實體的XML文件; 文档=>zh-mo:文件 – city.xml

表2-2中列出了用來描述擁有一個city實體的tourGuide的XML文件; 文档=>zh-mo:文件。需要注意以下幾點:

  • 每一個XML文件; 文档=>zh-mo:文件的第一行都以XML聲明開始{1}。
  • 隨後的聲明標明了該文件; 文档=>zh-mo:文件的根元素(tourGuide)以及schema檔案(city.xsd),該聲明使用xsi=schemaLocation {2-4}。
  • 對於第一個城市{5-19}和第二個城市{20-33}的定義。
  • 根元素的結束標籤{34}。
由XML schema約束的XML文件; 文档=>zh-mo:文件可以進行有效性驗證。一個「有效」的XML文件; 文档=>zh-mo:文件是一個「結構良好」的XML文件; 文档=>zh-mo:文件,也就是說其也遵循了XMLschema中的規則。但是,需要注意的是即使文件; 文档=>zh-mo:文件是結構良好的,其仍有可能是無效的。例如,如下的XML文件; 文档=>zh-mo:文件片斷:
<city>
  <cityName>Boston</cityName>
  <country>United States</country>
  <adminUnit>Massachusetts</adminUnit>
......
</city>
我們可以看到,元素並沒有按照Schema中規定的正確順序出現。依據其聲明的schema,該XML文件; 文档=>zh-mo:文件可以(使用檢驗程式)進行有效性檢驗——檢驗程式將會發現上面提到的順序混亂的錯誤。

使用NetBeans建立上述的XML文件; 文档=>zh-mo:文件:

  1. 點擊File -> New -> XML -> XML Document。
  2. 將檔案儲存; 保存=>zh-mo:儲存為「city」。
  3. 選擇XML Schema-Constrained Document 作為文件; 文档=>zh-mo:文件的類型。
  4. 定義schema位置以及跟元素的名稱(tourGuide)。
  5. 複製並貼上上述代碼並儲存; 保存=>zh-mo:儲存。
  6. 進行良構性檢驗(ALT+F9)

進行有效性檢驗:

  1. 右鍵單擊文件; 文档=>zh-mo:文件節點擊; 点选=>zh-mo:點擊擇Validate XML。

如果XML檔案city.xml,遵循了XMLschema city.xsd的定義,則輸出窗口將顯示如下資訊:

Output Window - Validity check

在NetBeans中打開文件; 文档=>zh-mo:文件city.xml

小結:XML文件; 文档=>zh-mo:文件是一個包含有XML代碼和句法的檔案,是一個由元素及子元素良好組織而形成的實體。

XML 樣式表

[編輯]
可延伸樣式表語言(XSL)為XML文件; 文档=>zh-mo:文件的轉換以及以特定格式顯示內容提供了一種手段。由於XML文件; 文档=>zh-mo:文件並沒有提供瀏覽器能夠理解的標籤,比如HTML標籤,沒有包含了表達資訊的樣式表的輔助,瀏覽器便無法顯示出XML文件; 文档=>zh-mo:文件中的資料。通過將資料與表示邏輯相分離,XSL允許用戶根據其不同的需要和偏好瀏覽同樣的資料。
XSL轉換語言(XSLT)被用來進行XML文件; 文档=>zh-mo:文件的轉換,例如將XML文件; 文档=>zh-mo:文件轉換為用於瀏覽器瀏覽的HTML檔案。XSLT樣式表包含有一組格式說明,這些格式說明規定了XML文件; 文档=>zh-mo:文件內容在瀏覽器中的顯示方式,這一點與HTML的級聯樣式表(CSS)十分相似。使用不同的樣式表對於同樣的資料可以產生不同的視圖。而且樣式表不是僅僅用於瀏覽器顯示文件; 文档=>zh-mo:文件內容,例如,樣式表也可以用於XML檔案的轉換。
在檔案轉換過程中,XSLT對XML檔案進行分析,並將其轉化為一個節點樹,即XML文件; 文档=>zh-mo:文件的一種層次化的表示。樹中的每一個節點代表了一個XML文件; 文档=>zh-mo:文件片斷,例如一個元素、屬性或其他的文字; 文本=>zh-mo:文字內容。XSL樣式表包含有預定義的「模板」,這些模板定義了對於節點的操作。XSLT會通過匹配屬性將XML元素與模板聯絡起來,並且將其轉換成結果文件; 文档=>zh-mo:文件。


1.  <?xml version="1.0" encoding="UTF-8"?>
2.  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
3.    <xsl:output method="html"/>
4.    <xsl:template match="/">
5.        <HTML>
6.            <HEAD>
7.                <TITLE>Tour Guide</TITLE>
8.            </HEAD>
9.            <BODY>
10.                <H2>Cities</H2>
11.                <xsl:apply-templates select="tourGuide"/>
12.            </BODY>
13.        </HTML>
14.   </xsl:template>
15.   <xsl:template match="tourGuide">
16.        <xsl:for-each select="city">
17.           <xsl:text>City: </xsl:text>
18.            <xsl:value-of select="cityName"/>
19.            <BR/>
20.            <xsl:text>Population: </xsl:text>
21.            <xsl:value-of select="population"/>
22.            <BR/>
23.            <xsl:text>Country: </xsl:text>
24.            <xsl:value-of select="country"/>
25.            <BR/>
26.            <BR/>
27.        </xsl:for-each>
28.    </xsl:template>
29.  </xsl:stylesheet>

表2-3 City實體的XML樣式表 – city.xsl

讓我們分析一下上面的樣式表:

  • 由於XSLT使用XML語言編寫的,它們總是以標準的XML聲明加上XML句法規格開頭。
  • 標籤<xsl:stylesheet> 標明了樣式表定義的開始,並且聲明了版本號以及W3C的正式命名空間{2,3}。
  • 元素<xsl:template>定義了一個模板定義的開始,並且包含了對於匹配節點的操作規則的定義。匹配規則被用來將XML元素與樣式表進

行匹配。在上面的樣式表中即為XML原文件; 文档=>zh-mo:文件的根(/)或整個分支{4}。XSL尋找匹配的根然後輸出HTML檔案。

  • 模板元素內容包含在HTML資料輸出流中,這樣瀏覽器便可以進行相應的解釋{5-18}。
  • XSL<xsl:for-each>元素被用來對於一個特定節點集(此例中為元素city)中的所有節點進行遍歷,並將其加入到輸出檔案中{28}。
  • <xsl:value-of>元素從被選節點/XML元素(cityName)中提取屬性值,並將其加入到輸出資料流中。{18,21,24}

city.xsl樣式表的輸出結果如表2-3所示:

Cities

City: Belmopan
Population: 11100
Country: Belize

City: Kuala Lumpur
Population: 1448600

Country: Malaysia

使用NetBeans建立XML樣式表的步驟如下:

  1. 點擊File -> New -> XML -> XSL Stylesheet
  2. 將檔案儲存; 保存=>zh-mo:儲存為「city」
  3. 複製並貼上上述代碼到NetBeans編輯器,並儲存; 保存=>zh-mo:儲存。
  4. 對於樣式表進行格式良構性檢查。(ALT+F9)
注意:作為範例的city系列檔案(city.xsd, city.xml and city.xsl)也可以通過文字編輯器建立,並且結果能夠利用合適的瀏覽器例如Mozilla 1.6進行顯示。但是應該將所有的檔案儲存; 保存=>zh-mo:儲存在同一個目錄下並且在city.xml第一行中加入如下的代碼:
<?xml-stylesheet href="city.xsl" type="text/xsl"?>

該行代碼便將XSL樣式表與包含有城市資料的XML檔案建立起關聯。


小結:XSL是一種用來將資訊轉換成可表示形式的工具,而且同時還保持資料的含義。


XML在 Thomas Cook中的應用

[編輯]
作為世界領先的旅遊公司和得到廣泛認同的品牌,Thomas Cook在整個旅遊價值鏈——航線、賓館、旅遊公司、旅遊和出入境代理都有涉足,Thomas Cook 為全球的客戶提供了適用於不同細分市場的合適的產品。該集團擁有11,000名員工、33家旅遊公司、約3600家旅行代理、80架客機的航隊以及與之配套的26,000名工人。Thomas Cook在歐洲和世界範圍內擁有一個由616家辦事處所組成的辦公網絡。該公司目前是歐洲第二、世界第三大旅遊集團。
Thomas Cook也向其他公司提供產品,範圍從假日套餐到汽車租賃服務,因此它需要對其線上宣傳材料及服務清單進行即時; 实时=>zh-mo:即時的更新。Thomas Cook在使用XML技術之前,將資訊以HTML格式發布,這樣需要花費超過6周的時間來進行線上資訊的更新。

XML使得同樣的工作能夠在3天之內得到完成。這使得Thomas Cook所有的當前或潛在客戶以及分布在世界各地的代理商能夠取得即時; 实时=>zh-mo:即時的旅遊資訊。而以前他們至少需要等待6周的時間。

XML使得Thomas Cook能夠將資訊存放在一個簡單的數據庫中,這個數據庫可以根據需要進行無數次的重用。「我們並不想總是重複處理同樣的內容,而是要對於其進行即時; 实时=>zh-mo:即時的更新」,Thomascook.com內容經理Gwyn Williams說到,「XML給我們帶來了巨大的內部收益,例如我們現在可以將員工重新部署在更具價值的專案中」。Thomascook.com目前擁有65,000頁

XML格式的宣傳網頁以及旅遊指南和線上雜誌。

Thomas Cook在其資訊化建設的初期階段便採用了XML技術。由於Thomas Cook擁有一個大型的數據庫,XML的早期使用使得其能夠獲得很大益處。在某種程度上說,數據庫必須要與XML技術相結合,據報告:XML數據庫比傳統數據庫執行速度大大

提高,而這為ThomasCook提供了微弱的競爭優勢。

Thomas Cook發現,XML技術能夠帶來公司運營成本的實質性的降低,並且保持了各渠道資訊的一致性。通過部署一個用來支援宣傳冊製作以及網頁資訊發布的中央內容管理系統,Thomas Cook已經實現了全球範圍內的內容製造、維護以及傳送的整合化管理。

解析XML文件; 文档=>zh-mo:文件

[編輯]
我們已經學習了如何表示資料,接下來我們需要的就是處理該資料。這項工作能夠利用一種叫做XML解析器的軟件來實現,XML解析器能夠讀取XML文件; 文档=>zh-mo:文件並且對照XML schema進行有效性檢驗。XML解析器使得人們對於XML文件; 文档=>zh-mo:文件的內容和結構可以有更

好的了解。它支援XSLT標準,能夠將資料細分並傳遞給其他的應用程式或轉換成其他格式,例如HTML。

解析器類型:

DOM (Document Object Model 文件; 文档=>zh-mo:文件目標模型) – 此類解析器將整個XML文件; 文档=>zh-mo:文件讀入記憶體; 内存=>zh-mo:記憶體,依據XML文件; 文档=>zh-mo:文件建立目標樹結構然後等待用戶的指令。這種方式將受到記憶體; 内存=>zh-mo:記憶體容量的限制因為XML文件; 文档=>zh-mo:文件大小有可能超出記憶體; 内存=>zh-mo:記憶體的容量。

SAX, the Simple API for XML 簡單XML應用程式介面, 它是一個基於事件的解析器。此類解析器逐行讀取XML文件; 文档=>zh-mo:文件,並在發現任一目標元素時產生一個事件。例如,每個XML根標籤都會伴隨一個「start element」事件。SAX解析器在任 一時刻只會為客戶程式處理文件; 文档=>zh-mo:文件的一個或幾個片斷。當發現所需元素時,它便會從文件; 文档=>zh-mo:文件中返回資料。對於大型XML文件; 文档=>zh-mo:文件來說,SAX提供了在小記憶體; 内存=>zh-mo:記憶體佔用量條件下更快和更高效解析XML資料的方法。

我們需要針對應用的特點擊; 点选=>zh-mo:點擊擇DOM(基於樹)或SAX(基於事件)解析方式。但是,從本書的寫作初衷出發,我們使用一種開放原始碼; 源码=>zh-mo:原始碼的基於DOM的解析器——Xerces Java。Xerces Java能夠利用DOM方便地讀取文件; 文档=>zh-mo:文件資料並進行諸如添加、刪除節點的

操作。Xerces Java由apache.org發起並開發。

下面是用來進行解析的XML文件; 文档=>zh-mo:文件代碼。解析的結果是根據文件; 文档=>zh-mo:文件得到的DOM樹。該java程式由Hendrik Fischer編寫。

(NOTE from Klaas van Gelder (klaasvg@fastmail.fm): the class TypeTranslator does not exist in one of the imported packages, so the code does not compile...)


package Parser_Software;

//import class libraries needed for the parsing
//*NOTE: already included in latest Java SDK 1.4.x
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.w3c.dom.*;
import java.io.*; //import class for Input/Output
import java.util.Vector; //insert statement cache
public class MySimpleDOMParser
{
//global reference to our DOM object
static Document doc;

//parse given XML file when creating MyParser object
public MySimpleDOMParser(String filename)
{
//create file object that holds the XML file
File file = new File(filename);
try
{
/* THREE steps are needed to create a parser and save the
* document data into a DOM object
* 1. create factory object providing the parser
*/
DocumentBuilderFactory factory
= DocumentBuilderFactory.newInstance();

//2. create parser object building the DOM object
DocumentBuilder parser = factory.newDocumentBuilder();

/* 3. use parse method to create DOM object from the given file
* store the resulting DOM object into the "doc" variable
*/
doc = parser.parse(file);

/* +++NOW YOU CAN CALL ANY METHOD TO WORK WITH THIS DATA+++
* example - printNodes: prints out all nodes in the DOM tree
* - insertStatements: creates strings holding the insert
* statement If the document isn't well-formed, an exception has
* already been thrown and this has been skipped.
*/
System.out.println(file + " is well-formed.");

/* The parsing will only succeed if the XML file was well-formed,
* in anyother case it will throw an exception that is caught 
* by the following catch blocks */
}
catch (SAXException e)
{
System.out.println(file + " is not well-formed.");
}
catch (IOException e)
{
//usually happens if the file was not found
System.out.println("Due to an IOException, " +
"the parser could not check " + file);
}
catch (FactoryConfigurationError e)
{
System.out.println("Could not locate a factory class");
}
catch (ParserConfigurationException e)
{
//the JAXP class library was not loaded correctly
System.out.println("Could not locate a JAXP parser");
}
}

//print out the nodes starting at a given node (usually the root node)
public static void printNode(Node n)
{
//gather information about  the current node name
String name = n.getNodeName();
String type = TypeTranslator.getTypeName(n);
String uri = n.getNamespaceURI();
String value = n.getNodeValue();

//put results into a string buffer
StringBuffer output = new StringBuffer();
output.append("Node : " + name + "\n");
output.append("Type : " + type + "\n");

if (uri != null) output.append("NameSpace : " + uri + "\n");
if (value != null) output.append("Value : " + value + "\n");

//display the result to the user
System.out.println(output.toString());

//get a list of the current node's children in the DOM tree
NodeList children = n.getChildNodes();

//for every child node do the same - recursive call
for (int i = 0; i < children.getLength(); i++)
{
Node child = children.item(i);
printNode(child);
}
}//End of printNode()    
public static void main(String[] args)
{
//call this application with the command
//line arguments "file.xml file.xsd"
MySimpleDOMParser p = new MySimpleDOMParser(args[0]);

//get a list of all element nodes "city"
NodeList n = doc.getElementsByTagName("city");

printNode(doc);

}//End of main()

}//End of MySimpleDOMParser class

使用NetBeans建立並執行XML解析器:

首先,必須建立一個存放java檔案的包。

  1. 點擊File -> New -> Java Package。
  2. 儲存; 保存=>zh-mo:儲存為「'Parser_Software」

然後建立java檔案:

  1. 點擊File -> New -> Java Classes -> Java Class。
  2. 在java檔案包中儲存; 保存=>zh-mo:儲存為「MySimpleDOMParser」——建立命名的解析器。
  3. 複製並貼上上面的代碼。
  4. 點擊Build -> Set Arguments...
  5. 輸入XML文件; 文档=>zh-mo:文件的準確路徑。例如,c:\XML_Chapter\Chapter_2_Single_entity\city.xml
  6. 點擊Build -> Execute,執行操作

解析器輸出結果:

[編輯]
c:\XML_Chapter\Chapter_2_Single_Entity\city.xml is well-formed.
Node : #document
Type : Document
Node : xml-stylesheet
Type : Processing Instruction
Value : type="text/xsl" href="city.xsl" media="screen"
Node : tourGuide
Type : Element
Node : #text
Type : Text
Value :
&nbsp
Node : city
Type : Element
Node : #text
Type : Text
Value :
&nbsp
Node : cityName
&nbsp .
&nbsp .
&nbsp .
&nbsp .
&nbsp .
Type : Text
Value :


小結:解析器程式使得用戶可以方便地存取XML文件; 文档=>zh-mo:文件的內容和結構,並且允許用戶對於解析器本身進行處理和修正。

總結

[編輯]
XML(可延伸標記式語言)是一種在文字檔案中以結構化方式描述資料的方法。它主要用於資訊的交換。XML是基於網絡的、可延伸的、獨立於平台的語言,它是構建所有XML文件; 文档=>zh-mo:文件的基礎。
XML schema 描述了XML文件; 文档=>zh-mo:文件的內容和結構。XML文件; 文档=>zh-mo:文件包含了資料,而XML樣式表定義用於XML文件; 文档=>zh-mo:文件表示的格式說明。一個結構良好的XML文件; 文档=>zh-mo:文件完全遵循了XML句法,而如果文件; 文档=>zh-mo:文件同時遵循了相應的XMLschema,那麼它就是有效的。
基於DOM的解析器在記憶體; 内存=>zh-mo:記憶體中為待解析的XML文件; 文档=>zh-mo:文件建立了一個樹結構,而SAX則是逐步讀取文件; 文档=>zh-mo:文件資料並在發現標籤、文字; 文本=>zh-mo:文字或註釋時報告用戶。


練習

[編輯]

1. 一個博物館的問題。

a. 建立一個用來描述博物館實體的XML schema,該實體擁有以下屬性:博物館名稱、建館日期、地址、網址。並進行良構性和有效性驗證。
b. 利用剛才建立的schema建立XML文件; 文档=>zh-mo:文件,使其包含有兩個博物館的資料。並進行良構性和有效性驗證。
c. 編寫XML樣式表來顯示博物館的名稱、建館日期和網址。並進行良構性和有效性驗證。
d. 編寫一段java程式來對XML文件; 文档=>zh-mo:文件進行解析並列出每個博物館的名稱和地址。


2. XML資料流程圖模型。 建立包含以下組件的資料流程圖並解釋其如何工作:
- XSL樣式表
- XML文件; 文档=>zh-mo:文件
- XML schema
- XSL(T)處理器
- 不同的輸出結果
練習2的參考答案: