一、介紹 |
dom是w3c指定的一套規范標準,核心是按樹形結構處理數據,dom解析器讀入xml文件并在內存中建立一個結構一模一樣的“樹”,這樹各節點和xml各標記對應,通過操縱此“樹”來處理xml中的文件。xml文件很大時,建立的“樹”也會大,所以會大量占用內存。
sax解析器核心是事件處理機制。例如解析器發現一個標記的開始標記時,將所發現的數據會封裝為一個標記開始事件,并把這個報告給事件處理器,事件處理器再調用方法(startElement)處理發現的數據。下面我們嘗試一下SAX和DOM解析:
XML格式如下:
二、SAX: |
1、我們用SAX解析的時候用的是蘋果自帶的NSXMLParser,首先初始化一個解析器,通過設置代理開始解析,代碼如下:
//初始化路徑 NSString * path=[[NSBundle mainBundle] pathForResource:@"Test.xml" ofType:nil]; NSData * data=[NSData dataWithContentsOfFile:path]; //初始化解析器 NSXMLParser * parser=[[NSXMLParser alloc] initWithData:data];//設置代理 parser.delegate=self;//開始解析 [parser parse];
2、通過代理方法開始解析,由于sax方式是事件驅動,因此解析是按照順序解析,如果想獲取標簽的數據我們需要監控每個步驟的解析情況,因此系統提供了代理方法給我們,下面便是常用代理方法:
//開始加載文檔- (void)parserDidStartDocument:(NSXMLParser *)parser{}//結束加載文檔- (void)parserDidEndDocument:(NSXMLParser *)parser{}//開始解析標簽- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{}//標簽解析結束- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{}//讀取標簽之間的文本- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ content=string;}
3、XM有兩種存值方式,一個是屬性,一個是標簽之間的文本。如果我們想獲取屬性需要在代理方法中獲取,如圖:
如果是獲取標簽之間的文本需要采用代理方法如圖:
總結:通過給定代理方法的結合我們便可以輕松的獲取XML的內容
三、DOM |
1、我們用DOM解析的時候用的是第三方框架GDataXMLNode,該框架為動態庫。我們需要引入如下:
同時需要引入第三方支持框架:
DOM解析相對于SAX稍微簡單一些,DOM 首先將整個文件全部放入內存。然后在內存中以二叉樹的形式獲取里面的元素內容。
涉及到的主要類:
GDataXMLDocument //整個文檔
GDataXMLElement //節點對象
GDataXMLNode //屬性節點對象
我們可以用以下方法解析數據
//初始化 //將文件加入到內存GDataXMLDocument * document=[[GDataXMLDocument alloc] initWithData:data options:0 error:nil]; //獲取根元素 GDataXMLElement * root=document.rootElement;//獲取所有該名稱的子節點-(NSArray *)elementsForName:(NSString *)name;//根據名稱獲取屬性值-(GDataXMLNode*)attributeForName:(NSString *)name;
這樣我們便可以輕松解析并且獲取XMl的值了,如圖:
疑問咨詢或技術交流,請加入官方QQ群: (452379712)
新聞熱點
疑難解答