1- 環境 WindowsXp PHP5.2.5 Apache 2.0.55 2- 解析XML 2-1 什麼是DOM DOM(Document Object Model),是根據W3C的DOM規範建立的一種與浏覽器,平台,語言無關的接口,使其可以通路頁面其他的标準元件。它是以層次結構組織的節點或資訊片斷的集合。(如:XML檔案),解析後以樹形節點方式存在,DOM允許開發人員添加,編輯,移動或删除樹中任意位置的節點。 目前DOM分為三個階段分别是:Level1,Level2,Level3。 Level1:包括對 XML 1.0 和 HTML 的支援,每個 HTML 元素被表示為一個接口。它包括用于添加、編輯、移動和讀取節點中包含的資訊的方法,等等。然而,它沒有包括對 XML 名稱空間(XML Namespace)的支援,XML 名稱空間提供分割文檔中的資訊的能力。 Level2:添加了名稱空間支援。Level 2 擴充了 Level 1,允許開發人員檢測和使用可能适用于某個節點的名稱空間資訊。Level2 還增加了幾個新的子產品,以支援級聯樣式表、事件和增強的樹操作。 Level3: 包括對建立 Document 對象(以前的版本将這個任務留給實作,使得建立通用應用程式很困難)的更好支援、增強的名稱空間支援,以及用來處理文檔加載和儲存、驗證以及 XPath 的新子產品;XPath 是在 XSL 轉換(XSL Transformation)以及其他 XML 技術中用來選擇節點的手段。 *DOM不隻是XML,而XML必然是DOM。 2-2 什麼是DTD DTD(Documnet Type Definition),DTD 是一套關于标記符的文法規則。它是XML1.0版規格得一部分,是XML檔案的驗證機制,屬于XML檔案組成的一部分。 DTD 是一種保證XML文檔格式正确的有效方法,可以通過比較XML文檔和DTD檔案來看文檔是否符合規範,元素和标簽使用是否正确。一個DTD文檔包含:元素的定義規則,元素間關系的定義規則,元素可使用的屬性,可使用的實體或符号規則。 XML檔案提供應用程式一個資料交換的格式,DTD正是讓XML檔案能夠成為資料交換的标準,因為不同的公司隻需定義好标準的DTD,各公司都能夠依照 DTD建立XML檔案,并且進行驗證,如此就可以輕易的建立标準和交換資料,這樣滿足了網絡共享和資料互動。DTD檔案是一個ASCII的文本檔案,字尾名為.dtd。 2-3 什麼是XPath XPath 是一種在XML文檔中查找資訊的語言。XPath用于在XML文檔中通過元素和屬性進行導航。 XPath 使用路徑表達式來選取 XML 文檔中的節點或者節點集。這些路徑表達式和我們在正常的電腦檔案系統中看到的表達式非常相似。 3- 目前PHP中解析XML檔案的四種方式 (1)SAX方式(Simple API for XML),簡單XML解析API,以函數形式存在;(可封裝但不能被繼承) (2)純DOM方式,目前PHP5支援到DOM Level2,以類方式存在;(可繼承與封裝) (3)DOMXML方式,基于DOM方式PHP将其封裝後以函數形式(可封裝但不能被繼承)--筆者推薦方式 (4)SimpleXML方式,PHP獨有XML解析API,被直接綁定在PHP5中并被應用,可直接對DOM對象進行直接XML操作,以函數形式存在(可封裝但不能被繼承) 3-1 SAX方式解析XML文檔 從PHP3起就被裝入,基于W3C開發的一種用于解析XML檔案方式。在該種方式下使用PHP的以xml_XXXX系列函數組成,在該種方式下是以建立各要素的Handler(句柄),後按照檔案讀入方式進行解析的一種方式,被直接編譯到PHP中,不需加載PECL,以函數傳回句柄方式處理,因為采用位元組讀取方式是以不能建立XmlTree,是以不使用XPath對XML進行快速友善的解析。 但對<!DOCTYPE中的ENTITY(實體)不能進行很好的解析。(在PHP5中不能解析,PHP4解析正常)如: 另外,該種解析方式目前已被PHP中的另三種方式所取代。 簡單代碼示例: 3-2 純DOM解析方式解析XML文檔 從PHP5開始被引入的一組純DOM類,以DOMXXXX類形式存在,該種方式是使用new關鍵字建立類對象,對類對象進行操作的一種方式,在該種方式下,由于是以類方式存在,是以在PHP5下可以建立擴充(繼承,extends)關系按照個人喜好進行編碼。該種方式可以很好的解析XML中 ENTITY(實體),并對XML檔案的有效性進行驗證。(DTD,Document Type Definition,XML1.0規格部件,用于驗證XML文檔的編寫有效性。) 但在該種方式下打開PHP5的“zend.ze1_compatibility_mode” (PHP4,5互相容,使用PHP4的對象方式處理對象)設定為“On”時會出錯。 錯誤情況:由于該類在PHP5下被開發,但PHP4下沒有,是以當設定“zend.ze1_compatibility_mode”後,PHP所有所使用new(包括繼承)時都會出錯,出現緻命運作錯誤,導緻檔案不能被解析。如:$xpath = new DOMXpath的這種方式。 原因:可能是BUG。(個人論斷) 縱觀PHP5的所有更新LOG中在較大版本中都會出現“zend.ze1_compatibility_mode”調整的FIX被追加到所有PHP大的版本更新中,如:5.2,5.1,5.0中都有該設定的BUG出現與調整。可以看出該項設定就是在為PHP4打更新檔,也可以看出類的“&”被柄棄采用java的clone失敗(個人感覺這是PHP5的一次失敗,因為在PHP4中隻能使用“&”作為位址引用,雖然在PHP幫助文檔中強調 clone被引用的好處及編碼習慣,但我仍感覺目前PHP5下的Clone還是太弱,針對該項設定的 “zend.ze1_compatibility_mode”仍有很多問題) 該種方式下可以與Xpath類相結合對文檔結構進行快速查詢。(但現PHP5下該XPath功能不是十分強大),不能使用較複雜的Xpath查詢,目前 DOM方式下不能對“/book/chapter[@name='en']/para”這種方式進行解析(解析出錯)。 純DOM方式隻能處理“/book/chapter[@name='en']” 對于之後存在的節點無法解析。 簡單代碼示例: 3-3 DOMXML方式解析XML文檔 DOMXML方式從PHP4.3.0被綁定到PHP中,基于DOM API,将DOM對象封裝後以專門處理XML解析的一種DOM API函數,将有關處理XML解析方面的DOM方法,類變量進行封裝或重新優化定義。 *該種方式從PHP5開始不被綁定到PHP,而被移到PECL庫中,使用時需要加載PECL擴充庫---php_domxml.dll。 由于基于DOM API,是以具有DOM相關特性,但由是屬于封裝接口函數,是以不具有擴充性(繼承,extends)。 該種方式是PHP專門用來解析XML檔案開發,是以對于XML解析的功能十分強大,能夠滿足幾乎所有XML文檔的操作,并且支援複雜的XPath查詢。 由于是采用函數接口封裝形狀且自PHP4時代起就被綁定,是以不受之前所說的“zend.ze1_compatibility_mode” 設定影響,适合PHP4時代建立的大規模程式類處理對XML解析使用。(因為不受“zend.ze1_compatibility_mode” 的影響是以可以正常被“zend.ze1_compatibility_mode”機制處理,不會産生運作錯誤。而之前的DOM方式時會産生運作錯誤無法解析。) XPath機制被優化并可以處理複雜的查詢如:“/book/chapter[@name='en']/para[@value='tv']/value”複雜的Xpath。 簡單代碼示例: 3-4 SimpleXML方式解析XML SimpleXml(Simple API for XML),從PHP5.0.0Beta1開始被編譯進PHP中,在PHP5更新過程中不斷被優化與修正。以非常直覺的方式對從XML中取出的資料進行重新組合,XML的各個節點以類變量的形式可以進行友善直覺的應用。 但是隻能處理簡單XML文檔進行解析處理,對複雜XML解析不是很适用,不能對節點進行增,删,改,移操作。 操作開發十分簡單,至5.2.5中SimpleXML函數僅有1個類,3個函數。可以像操作類對象一樣操作各個節點。該方式下,可以允許将純DOM對象進行加載并進行處理。 該方式下可直接引用原純dom對象,并對該對象進行SimpleXml操作。 該種方式個人認為是補足純DOM方式的不直覺性與友善性所建立的,但是結果并不是令人很滿意,雖然引入DOM但是卻不能像DOM那樣對XML文檔中所有元素進行解析,尤其是Entity(實體,“SAX方式解析XML文檔”中所說的部分),對于Xpath也不能像DomXml那樣可以得理複雜查詢。 另外由于該方式也是從PHP5開始被引入,是以當設定了“zend.ze1_compatibility_mode”機制後,會像純 DOM方式一樣不能被建立,報運作時緻命錯誤,不能正常解析。 簡單代碼示例: 4- 總結 根據以上說明我将這幾種方式進行了如下總結: 4-1 SAX方式解析XML文檔優缺點 優點: (1)功能較健全,能滿足一般XML相關文檔解析工作; (含有對象封裝函數) (2)解析最快,适合較大XML檔案解析時使用; (3)PHP各版本間相容性好,在不解析Entity(實體)的前提下可直接相容;(PHP4,5,6?) (4)由于采用函數接口方式,是以可被封裝。 (5)可使用如ZendStudio調試并檢視解析内容(變量内容可被直接檢視輸出); (6)不需加載PECL,直接編譯進PHP。 缺點: (1)由于解析方式采用位元組方式,是以屬一次手動解析過程,不能建立XmlTree,不能使用Xpath做快速解析工作。 (2)不能對文檔中各個節點進行操作(增,删,改,移); (3)沒有提供生成XML檔案機制(函數)(即,String2Xml); (4)編碼相對複雜不直覺,邏輯性強; (5)更新到PHP5後,對Entity(實體)不能進行解析。 4-2 純DOM方式解析XML文檔優缺點優點: (1)功能健全,能滿足複雜XML相關文檔解析工作;(在PHP5環境下,可被繼承并靈活調整) (2)采用類方式,編碼較直覺(有較強的OOP概念),編碼靈活; (3)可對文檔中各個節點進行操作(增,删,改,移); (4)提供可生成XML檔案的機制(SaveXml); (5)可使用簡單Xpath方式對XML進行快速檢索; (6)可使用DTD對XML文檔有效性進行驗證; (7)不需加載PECL,直接編譯進PHP5中; (8)可很好的解析Entity(實體)。缺點: (1)由于屬純DOM解析方式,是以速度與其他XML專門處理方式比較相對較慢; (2)PHP5專有類,不具有PHP4相容性且不斷在FIX階段; (3)由于采用PHP内部類方式傳回,是以不能使用如ZendStudio檢視解析内容情況,不友善調試; (4)設定“zend.ze1_compatibility_mode” 為“On”時報緻命運作錯誤,不能解析。 4-3 DOMXML方式解析XML文檔優缺點優點: (1)功能很健全,能滿足複雜XML相關文檔解析工作; (2)編碼直覺,處理靈活; (3)可對XML文檔中各個節點進行操作(增,删,改,移); (4)提供生成XML檔案的函數機制; (5)可使用複雜的Xpath方式對XML進行全面快速的檢索,支援多級屬性的Xpath組合查詢; (6)可使用DTD對XML文檔有效性進行驗證; (7)相容性好可靈活應用于(PHP4,5),從PHP5的LOG相關資料可以看到對于DOMXML的調整并不多,是以有理由相信,該方式的成熟穩定性。(對PHP來說穩定很重要); (8)由于采用函數接口方式且PHP4即被使用是以不受“zend.ze1_compatibility_mode” 設定影響; (9)可使用ZendStudio等工具對獲得到的所有對象中内容進行檢視,(必要資訊),有利于開發調試; (10)可很好的解析Entity(實體)。 缺點: (1)采用函數接口方式處理,影響一定擴充性; (2)需加載PECL并進行配置; (3)純PHP思想處理方式(OOP概念不強,PHP自3以來至今思想影響較大) (4)容易與DOM概念混淆,DOM不隻是XML,而XML必然是DOM。 *本人推薦方式 4-4 SimpleXML方式解析XML文檔優缺點優點: (1)不需加載PECL擴充直接使用; (2)與其他三種方式相比,操作十分簡單直覺,節點以類對象方式存在,上手度較好; (3)可以進行簡單Xpath查詢; (4)可以将DOM對象引入,并以SimpleXml方式操作查詢節點資訊;(雖然還不是很完善) (5)可使用ZendStudio等工具對獲得到的對象内容進行檢視,有利于開發調整; 缺點: (1)不能像 DOM與DomXml那樣對Entity(實體)進行解析; (2)設定“zend.ze1_compatibility_mode” 為“On”時報緻命運作錯誤,不能解析。 |
|