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
#importXMLParser.m@interface XMLParser : NSObject //開始解析 -(void)start; @end
-(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(@"解析完成..."); }
如有不足之處還望指出!