[iOS] Parser Capabilities and Architecture

此份文件為個人學習事件驅動XML程式的翻譯,內文請參考蘋果官方文件,若有翻譯錯誤請見諒,請勿挪作商業用途,並著明出處。


通常有兩種方式去解析和處理XML,它們有自己樣式的API:
  • Tree-based API: 這方法會把XML文件映照到一個內在樹狀結構(internal tree structure),這結構符合schema描述的邏輯結構,從而讓navigation和操作樹更加簡單。很多樹型(tree-based)API都可以用,包括World Wide Web Consortium (W3C)提出的DOM (Document Object Model)。XML Path Language (XPath)、 XML Inclusions (XInclude)和XML Pointer Language (XPointer)都是 WC3 綱領性介面,用來搜尋(querying)和處理DOM類型的樹狀結構裡面的XML。 
  • Event-driven API: 在這個方法中,當parser遇到解析事件(parsing event) (像是每個元素的開始和結束)時,parser會回報給應用程式。在C語言型的API中,這個回報會透過應用程式所實作的呼叫(callback)來實現,這呼叫是用來處理事件的類型(type)。SAX就是這種類型的解析API中最有名的例子。這種類型的parser有時叫做streaming parser。   
 NSXMLParser類別採用事件驅動類型的parsing。但NSXMLParser物件(或簡單的說,一個parser)會送出訊息給它的委任而不是使用callback,它對每種解析事件送出不同的訊息。當parser逐步遇到XML或DTD檔案中的每個項目(元素、屬性、宣告、實體參照(entity reference)等等)時,他回報給它的委任(若委任實作了相關的方法),和任何的surrounding context。除了回報以外它並不會對這些項目作任何事。

假設你有以下的XML檔案:

<?xml version= "1.0" encoding="UTF8">
<article author="John Doe">
    <para>This is a very short article.</para>
</article>

Parser會回報下列事件給它的委任:
  1. 開始解析文件
  2. 找到元素article的開始標籤
  3. 找到元素article的author屬性,其值為John Doe
  4. 找到元素para的開始標籤
  5. 找到文字This is a very short article
  6. 找到元素para的結束標籤
  7. 找到元素article的結束標籤
  8. 結束解析文件
樹狀和事件解析方法都有它們自己的優點與缺點。它需要可觀的記憶體去建立一個internal tree來表示一個XML文件,特別是如果這個文件很大時。如果有必要把被解析的文件的樹狀結構映照到一個更強的類型、應用導向(application-specific)的樹狀結構,這個問題是混合的(compounded)。

事件導向解析,因為它一次只處理一個XML結構(construct)而不是一次就處理全部,所以它消耗的記憶體比樹狀解析少。對於效能第一而不是被解析的XML的修正為第一的情況來說,這是最佳選擇。事件解析的應用程式是搜尋XML文件的存放處(或是一個有多個紀錄(record)的XML文件)尋找特定的元素和對這些元素內容做些處理。舉例來說,你可以使用NSXMLParser去搜尋在Bonjour網路中的所有機器的屬性列preference檔案去集中(gather)網路組態資訊(network-configuration information)。

事件導向解析較不適合於需要XML服從於廣大的使用者搜尋或是被修改複寫回檔案去。事件驅動parser像是NSXMLParser也不提供任何合法的協助(意即,查核是否XML符合在DTD或是其他 schema中指定的結構規則)。對這些種類的任務,你需要DOM類型樹。然而,你可以使用一個事件驅動parser像是NSXMLParser來建構你自己的internal tree結構。

除了回報解析事件,NSXMLParser物件會查核XML或DTD是否well-formed。舉例來說,它檢查一個元素的開始標籤是否有一個相對應的結束標籤,或屬性是否有賦值。若他欲到任何語法錯誤(syntactical error),它會停止解析並通知委任。

雖然parser懂XML和DTD這樣的標記(markup)語言,但它可以解析任何XML類型的語言schema像是RELAX NG和XML schema。    

 

 

留言