此份文件為個人學習事件驅動XML程式的翻譯,內文請參考蘋果官方文件,若有翻譯錯誤請見諒,請勿挪作商業用途,並著明出處。
通常有兩種方式去解析和處理XML,它們有自己樣式的API:
但NSXMLParser物件(或簡單的說,一個parser) 會送出訊息給它的委任而不是使用callback, 它對每種解析事件送出不同的訊息。 當parser逐步遇到XML或DTD檔案中的每個項目(元素、 屬性、宣告、實體參照(entity
reference)等等)時,他回報給它的委任( 若委任實作了相關的方法),和任何的surrounding
context。除了回報以外它並不會對這些項目作任何事。
假設你有以下的XML檔案:
Parser會回報下列事件給它的委任:
它需要可觀的記憶體去建立一個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。
通常有兩種方式去解析和處理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。
假設你有以下的XML檔案:
<?xml version= "1.0" encoding="UTF8"> |
<article author="John Doe"> |
<para>This is a very short article.</para> |
</article> |
Parser會回報下列事件給它的委任:
- 開始解析文件
- 找到元素article的開始標籤
- 找到元素article的author屬性,其值為John Doe
- 找到元素para的開始標籤
- 找到文字This is a very short article
- 找到元素para的結束標籤
- 找到元素article的結束標籤
- 結束解析文件
事件導向解析,因為它一次只處理一個XML結構(
事件導向解析較不適合於需要XML服從於廣大的使用者搜尋或是被
除了回報解析事件,
雖然parser只懂XML和DTD這樣的標記(markup)
留言
張貼留言