第二章 背景
2.1 XML 與XPath
在 2.1.1 節會從 HTML 介紹到 XML 的起源與特性,而 2.1.2 節是說 明 XPath 的功能及語法。
2.1.1 HTML 與 XML 介紹
回顧全球資訊網所採用的 HTML (HyperText Markup Language)網 頁 標 準 格 式 。 HTML 基 本 上 是 一 個 以 SGML(Standard Generalized Markup Language)所定義出來的描述語言(Markup Language)。 然而,
HTML 卻有下列不足的地方:
z 擴充性(Extensibility):HTML 並無法讓使用者可以自行定義標 籤(tag)、屬性(attribute)。
z 結構化(Structure):HTML 的標記只是註記,並不支援正規結構 的定義,以表示資料庫(database)中的 schema 或者是物件導向的 hierarchy。
z 驗證(Validation):HTML 也無法透過 HTML 語言的定義,來為某 個 HTML 文件進行查核驗證(Validation)的工作。
除了彌補 HTML 的不足,為了滿足各式各樣的應用需求並且將 Web 的 發 展 推 向 一 個 分 散 式 資 料 處 理 的 新 領 域 , W3C(Word Wide Web Consortium) 以 及 其 參 與 成 員 於 是 制 訂 了 XML(eXtensible Markup Language)。
相對於 HTML 網頁格式, XML 的主要優點是使用者可以自行定義所 需要註記之語言。這讓使用者得以保存所註記資料的語意及與將其資 料結構化。舉例來說,一家商店可能保留其顧客的基本資料。假設該 商店的保留的某顧客資料如下:
周大強
電話:(03)5712121
地址:新竹市大學路 1001 號
若是使用 HTML 來儲存,一個可能的寫法如下:
<H1>周大強</H1>
<TABLE BORDER="1">
<TR><TD>電話:</TD>
<TD><B>(03)5712121</B></TD>
</TR>
<TR><TD>地址:</TD>
<TD><B>新竹市大學路 1001 號</B></TD>
</TR>
</TABLE>
然而,對這份 HTML 資料文件而言,它要對 Web 所顯示的真正資訊—
顧客姓名、地址與電話—已經消失;相對地,它只顯示了在文字上,
哪些要變成標題,哪些要製成一個 table,哪些要成為粗體字等等。
這文件中的名字、電話、地址等語意已經不見了。若改用 XML 格式,
則可將這些語意存於標記(tag)中。例如︰
<PERSON>
<NAME>周大強</NAME>
<PHONE>(03)5712121</PHONE>
<ADDRESS>新竹市大學路 1001 號</ADDRESS>
</PERSON>
上述的例子,顯示 XML 格式的資料仍可以保留 NAME、PHONE、ADDRESS 等訊息,這可用於與其他資料模式的系統(如資料庫)做資料交換。
這是 XML 資料模式重要的地方。至於呈現的部份可用 XSLT (eXtensible Stylesheet Language Transformation)來轉化成網頁。
簡言之,XML 不但是用來讓機器之間交換資料的橋樑,還可以是人 與人之間的溝通媒介;XML 也不僅僅與 Web 有關,更可以和所有一般 的 事 務 相 關 。 XML 已 經 是 當 今 電 子 商 務 資 訊 交 換 (Information Exchange)的標準。由於資料使用的重複率高,將資料改用 XML 儲存,
對於資料的保存及再利用都有很好的效果,因此 XML 應該會在極短的 未來廣泛的被採用,漸漸的取代 HTML 的地位。
2.1.2 XPath (XML Path Language):
XPath 是 W3C 的一種標準[1][20][21],他所定義的語法和語意可 供 XSLT 使用,主要目的是用來定出 XML 文件中各個部分的位置。XPath
z ancestor, ancestor-or-self z Parent, self, child
z descendant, descendant-or-self z following, following-sibling z preceding, preceding-sibling z attribute
z processing-instruction() z node()
謂語(Predicates):謂語可有可無,也可以有好幾則。我們可 以在謂語中使用運算式來篩選所選取的節點。
謂語運算式:
z Boolean: or , and , = , != , <= , < , >= , >
z Numeral: + , - , * , div , mod z Functional: position( )
範例:
z child::tr[position( ) > =0]
Æ 取 child 位置大於 0 的
z child::table[attribute::width =“150"]
Æ 取 child 名稱是 table,且有個屬性 width 的值是 150。
z tr[position()=0 AND child::td]
Æ 取第 0 個 tr,且有 child 為 td。
圖 2-1 是 XPath 的一個範例,目前節點是/TABLE/TBODY,他的取向軸 是"child",節點測試是"TR",謂語是"position()>=0",意思是只要 是 TBODY 的 child,且位置大於等於 0 就會被選取。因此圖中的那兩 個 TR 就都被選出來了。
TABLE
TBODY
TR TR
TD TD TD TD
…/TABLE/TBODY/child::TR[position( ) >= 0]
圖 2-1: XPath 的範例