iOS 中 XML 資料交換格式
XML 是一種自描述的資料交換格式,但是 XML 的資料交換格式並沒有 JSON 來的輕便,但是無可否認的是,XML 的應用範圍也是非常廣泛的,比如在 ROS(一個開源機器人作業系統)中利用 XML 來描述包的依賴關係等,當然還有很多了。
對於 XML 文檔操作包括了“讀”與“寫”,讀入 XML 文檔並分析的過程稱為“解析” XML 文檔,“解析” XML 文檔在實際開發中是占很大比重的。
讀寫 XML 文檔,目前流行的有兩種模式:SAX 和 DOM 。SAM 是一種基於事件驅動的解析模式。解析 XML 的時候,程式從上到下讀取 XML 文檔,如果遇到開始標籤、結束標籤、屬性等,就會觸發相應的事件,但是這種解析 XML 檔案有一個弊端就是只能讀取 XML 文檔,而不能寫入 XML 文檔。但是也是有優點的,就是解析速度快,而iOS中推薦使用 SAX 解析模式。
DOM 模式是將 XML 文檔作為一棵樹狀結構來進行分析,提供擷取節點的內容,以及相關屬性,或是新增、刪除和修改節點的內容。 XML 解析器在載入 XML 檔案以後,DOM 將 XML 檔案的元素視為一個樹狀結構的節點,一次性讀入到記憶體中。如果文檔比較大,解析速度就會比較慢,這是不可避免的。但是 DOM 模式有一點是 SAX 無法取代的,就是 DOM 能夠修改 XML 文檔。
NSXML
NSXML 是蘋果自家預設的解析架構,採用 SAX 模式進行解析。它是 SAX 解析模式的代表。NSXML 架構中的核心是 NSXMLParser 和它的委託協議 NSXMLParserDelegate。主要的解析工作是在委託協議的實作類別中完成的,委託中定義了很多回調方法,在 SAX 解析器從上到下遍曆 XML 文檔的過程中,遇到開始標籤、結束標籤、文檔開始、文檔結束和字串就會觸發相關方法。
常用的方法:
(1)parserDidStartDocument --文檔開始的時候觸發
(2)parser:didStartElement:namespaceURI:qualifiedName:attributes --遇到一個開始標籤時開始觸發,其中 namespaceURI 部分是命名空間, qualifiedName 是限定名,attributes 是字典類型的屬性集合
(3)parser:foundCharacters --遇到字串時觸發
(4)parser:didEndElement:namespaceURI:qualifiedName --遇到結束標籤時觸發
(5)parserDidEndDocument --遇到文檔結束時觸發
下面實現一個解析的XMLParser類。
XMLParser.h
#import @interface XMLParser : NSObject //開始解析-(void)start;@end
XMLParser.m
-(void)start{ NSString* path = [[NSBundle mainBundle] pathForResource:@"Test" ofType:@"xml"]; //解析一個Test.xml檔案的文檔 NSURL *url = [NSURL fileURLWithPath:path]; //開始解析XML NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url]; parser.delegate = self; [parser parse]; NSLog(@"解析完成...");}
如有不足之處還望指出!