日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

iOS中XML解析汇总

發布時間:2023/12/15 asp.net 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS中XML解析汇总 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

在時間上TBXML占優,libxml2支持了邊下載邊解析。

?

來源:http://www.codeios.com/forum.php?mod=viewthread&tid=9880&highlight=xml

?

?

解析 XML 通常有兩種方式,DOM 和 SAX:

?

DOM解析XML時,讀入整個XML文檔并構建一個駐留內存的樹結構(節點樹),通過遍歷樹結構可以檢索任意XML節點,讀取它的屬性和值。而且通常情況下,可以借助XPath,直接查詢XML節點。

?

SAX解析XML,是基于事件通知的模式,一邊讀取XML文檔一邊處理,不必等整個文檔加載完之后才采取操作,當在讀取解析過程中遇到需要處理的對象,會發出通知對其進行處理。

?

一般在iOS平臺下,比較常用的XML解析類庫有如下幾種:

?

NSXMLParser,這是一個SAX方式解析XML的類庫,默認包含在iOS SDK中,使用也比較簡單。

?

libxml2,是一套默認包含在iOS SDK中的開源類庫,它是基于C語言的API,所以使用起來可能不如NSXML方便。這套類庫同時支持DOM和SAX解析,libxml2的SAX解析方式還是非常酷的,因為它可以邊讀取邊解析,尤其是在從網上下載一個很大的XML文件,就可以一邊下載一邊對已經下載好的內容進行解析,極大的提高解析效率。

?

TBXML,這是一套輕量級的DOM方式的XML解析類庫,有很好的性能和低內存占用,不過它不對XML格式進行校驗,不支持XPath,并且只支持解析,不支持對XML進行修改。

?

TouchXML,這也是一套DOM方式的XML解析類庫,支持XPath,不支持XML的修改。

?

KissXML,這是一套基于TouchXML的XML解析類庫,和TouchXML相比,支持了XML的修改。

?

TinyXML,這是一套小巧的基于C語言的DOM方式進行XML解析的類庫,支持對XML的讀取和修改,不直接支持XPath,需要借助另一個相關的類庫TinyXPath才可以支持XPath。

?

GDataXML,這是一套Google開發的DOM方式XML解析類庫,支持讀取和修改XML文檔,支持XPath方式查詢。

?

那么對于如何在項目中選擇合適的XML解析類庫呢?網上已經有人對這幾款XML類庫做過分析和對比,可參考《How To Choose The Best XML Parser for Your iPhone Project》 一文,基本比較準確和客觀,文中建議:

?

如果是讀取很小的XML文檔,性能基本上沒有什么差別,不過從調用的方便性來說,建議使用TouchXML、KissXML或GDataXML

?

如果是需要讀取和修改XML文檔,建議使用KissXML或GDataXML

?

如果需要讀取非常大的XML文檔,則建議使用libxml2或TBXML

?

如果你不想去調用第三方類庫,那么使用NSXML也可以

?

?

TBXML

?

1. 解壓TBXML.zip后,將包含TBXML.h, TBXML.m, NSDataAdditions.h和NSDataAddtions.m四個文件的文件夾拖到項目中

2. 添加對libz.dylib類庫的應用 (項目=>Build Phases=>Link Binary With Libraries=>+=>libz.dylib=>add)

?

在需要調用TBXML的代碼文件頭部,加入:

C代碼??
  • #import?"TBXML.h"??
  • ?

    來源:?http://www.61ic.com/Mobile/iPhone/201108/36543.html

    ?

    ?

    使用說明:

    ?

    .h

    C代碼??
  • #import?<UIKit/UIKit.h>??
  • #import?"TBXML.h"??
  • ??
  • @interface?SecondViewController?:?UIViewController??
  • {??
  • ????TBXML?*tbxml;??
  • ????NSMutableArray?*articles;??
  • }??
  • ??
  • -?(void)?loadURL;??
  • -?(void)?loadXMLString;??
  • -?(void)?loadXMLData;??
  • -?(void)?loadArticles;??
  • -?(void)?loadUnknownXML;??
  • -?(void)?traverseElement:(TBXMLElement?*)element;??
  • ??
  • @end??
  • ?

    .m

    Java代碼??
  • -?(void)viewDidLoad??
  • {??
  • ????[self?loadURL];??
  • ????[self?loadArticles];?//??打印xml內容,以及存儲內容到數組中??
  • ????[self?loadXMLString];??
  • ????[self?loadXMLData];??
  • ????[self?loadUnknownXML];??
  • ??????
  • ????[super?viewDidLoad];??
  • ????//?Do?any?additional?setup?after?loading?the?view,?typically?from?a?nib.??
  • }??
  • ??
  • -?(void)loadURL?{??
  • ????//?Load?and?parse?an?xml?string??
  • ????tbxml?=?[[TBXML?alloc]?initWithURL:[NSURL?URLWithString:@"http://feeds.feedburner.com/IbtimescomWorld?format=xml"]];??
  • ??????
  • ????//?If?TBXML?found?a?root?node,?process?element?and?iterate?all?children??
  • ????if?(tbxml.rootXMLElement)??
  • ????????[self?traverseElement:tbxml.rootXMLElement];??
  • ????
  • ????//?release?resources??
  • ????tbxml?=?nil;??
  • }??
  • ??
  • -?(void)loadArticles?{??
  • ????//?Load?and?parse?an?xml?string??
  • ????tbxml?=?[[TBXML?alloc]?initWithURL:[NSURL?URLWithString:@"http://feeds.feedburner.com/IbtimescomWorld?format=xml"]];??
  • ??????
  • ????//tbxml?=?[TBXML?tbxmlWithXMLFile:@"books.xml"];??
  • ??
  • ????TBXMLElement?*root?=?tbxml.rootXMLElement;??
  • ??
  • ????if?(root)???
  • ????{??
  • ????????TBXMLElement?*channel?=?[TBXML?childElementNamed:@"channel"?parentElement:root];??
  • ????????if?(channel)???
  • ????????{??
  • ????????????articles?=?[NSMutableArray?array];??
  • ??????????????
  • ????????????TBXMLElement?*item?=?[TBXML?childElementNamed:@"item"?parentElement:channel];??
  • ????????????while?(item)???
  • ????????????{??
  • ????????????????TBXMLElement?*title?=?[TBXML?childElementNamed:@"title"?parentElement:item];??
  • ????????????????TBXMLElement?*link?=?[TBXML?childElementNamed:@"link"?parentElement:item];??
  • ????????????????TBXMLElement?*description?=?[TBXML?childElementNamed:@"description"?parentElement:item];??
  • ????????????????TBXMLElement?*date?=?[TBXML?childElementNamed:@"pubDate"?parentElement:item];??
  • ??????????????????
  • ????????????????//NSLog(@"\n?title?=>?%@",[TBXML?textForElement:title]);??
  • ??????????????????
  • ????????????????NSDictionary?*newsItem?=?[NSDictionary?dictionaryWithObjectsAndKeys:??
  • ??????????????????????????????????????????[TBXML?textForElement:title],?@"title",??
  • ??????????????????????????????????????????[TBXML?textForElement:link],?@"link",??
  • ??????????????????????????????????????????[TBXML?textForElement:description],?@"desc",??
  • ??????????????????????????????????????????[TBXML?textForElement:date],?@"date",??
  • ??????????????????????????????????????????nil];??
  • ??????????????????
  • ????????????????[articles?addObject:newsItem];??
  • ????????????????item?=?[TBXML?nextSiblingNamed:@"item"?searchFromElement:item];??
  • ????????????}??
  • ????????}??
  • ????}???
  • ??????
  • ????for(int?i=0;i<[articles?count];i++)????
  • ????{????
  • ????????NSLog(@"%@",[articles?objectAtIndex:i]);????
  • ????}????
  • ??
  • ????tbxml?=?nil;??
  • }??
  • ??
  • -?(void)loadXMLString?{??
  • ????//?Load?and?parse?an?xml?string??
  • ????tbxml?=?[[TBXML?alloc]?initWithXMLString:@"<root><elem1?attribute1=\"elem1-attribute1\"/><elem2?attribute2=\"attribute2\"/></root>"];??
  • ??????
  • ????//?If?TBXML?found?a?root?node,?process?element?and?iterate?all?children??
  • ????if?(tbxml.rootXMLElement)??
  • ????????[self?traverseElement:tbxml.rootXMLElement];??
  • ??????
  • ????//?release?resources??
  • ????tbxml?=?nil;??
  • }??
  • ??
  • -?(void)loadXMLData?{??
  • ????//?Load?and?parse?an?NSData?object??
  • ????NSString?*?xmlString?=?@"<root><elem1?attribute1=\"elem1-attribute1\"/><elem2?attribute2=\"attribute2\"/></root>";??
  • ????NSData?*?xmlData?=?[xmlString?dataUsingEncoding:NSASCIIStringEncoding];??
  • ??????
  • ????tbxml?=?[[TBXML?alloc]?initWithXMLData:xmlData];??
  • ??????
  • ????//?If?TBXML?found?a?root?node,?process?element?and?iterate?all?children??
  • ????if?(tbxml.rootXMLElement)??
  • ????????[self?traverseElement:tbxml.rootXMLElement];??
  • ??????
  • ????//?release?resources??
  • ????tbxml?=?nil;??
  • }??
  • ??
  • -?(void)loadUnknownXML?{??????
  • ????//?Load?and?parse?the?books.xml?file??
  • ????tbxml?=?[[TBXML?alloc]?initWithXMLFile:@"books"?fileExtension:@"xml"];??
  • ??????
  • ????//?If?TBXML?found?a?root?node,?process?element?and?iterate?all?children??
  • ????if?(tbxml.rootXMLElement)??
  • ????????[self?traverseElement:tbxml.rootXMLElement];??
  • ??????
  • ????//?release?resources??
  • ????tbxml?=?nil;??
  • }??
  • ??
  • -?(void)?traverseElement:(TBXMLElement?*)element?{??
  • ??????
  • ????do?{??
  • ????????//?Display?the?name?of?the?element??
  • ????????NSLog(@"%@",[TBXML?elementName:element]);??
  • ??????????
  • ????????//?Obtain?first?attribute?from?element??
  • ????????TBXMLAttribute?*?attribute?=?element->firstAttribute;??
  • ??????????
  • ????????//?if?attribute?is?valid??
  • ????????while?(attribute)?{??
  • ????????????//?Display?name?and?value?of?attribute?to?the?log?window??
  • ????????????NSLog(@"%@->%@?=?%@",[TBXML?elementName:element],[TBXML?attributeName:attribute],?[TBXML?attributeValue:attribute]);??
  • ??????????????
  • ????????????//?Obtain?the?next?attribute??
  • ????????????attribute?=?attribute->next;??
  • ????????}??
  • ??????????
  • ????????//?if?the?element?has?child?elements,?process?them??
  • ????????if?(element->firstChild)?[self?traverseElement:element->firstChild];??
  • ??????????
  • ????????//?Obtain?next?sibling?element??
  • ????}?while?((element?=?element->nextSibling));????
  • }??

  • 如果你關閉了ARC,請替換?tbxml = nil; 為?[tbxml release];

    如果你開啟了ARC,會有類似“arc forbids explicit message send of ...”這樣的錯誤,那么你需要轉換一下:

    ?

    ?

    Edit => Refactor => Convert to Objective-C ARC...

    ?

    其實就是把 NSDataAdditions.m 中的 [result autorelease] 替換成 return result;

    ?

    或者干脆關閉ARC,方法為:打開當前工程,打開"Build Settings",找到Objective-C Automatic Reference Counting項,將它的值設置為NO。

    ?

    ?

    本實例為ARC開啟

    ?

    全部API為:

    ?

    http://www.tbxml.co.uk/TBXML/API.html

    ?

    ?

    方法

    ?

    ?

    1.實例化

    ?

    + (id)tbxmlWithXMLFile:(NSString*)aXMLFile;

    用xml文件名(包括擴展名)實例化一個tbxml對象

    例如:TBXML * tbxml = [[TBXML alloc] initWithXMLFile:@”books.xml”];

    ?

    - (id)initWithXMLFile:(NSString*)aXMLFile fileExtension:(NSString*)aFileExtension

    用xml文件名和擴展名實例化一個tbxml對象

    例如:TBXML * tbxml = [[TBXML alloc] initWithXMLFile:@”books” fileExtension:@”xml”];

    ?

    - (id)initWithXMLString:(NSString*)aXMLString

    用一段xml內容代碼來實例化一個tbxml對象

    例如:tbxml = [[TBXML alloc] initWithXMLString:@”<root><elem1 attribute1=”elem1 attribute1″/><elem2 attribute2=”elem2 attribute2″/></root>;”];

    ?

    - (id)initWithXMLData:(NSData*)aData

    用一個封裝了xml內容的NSData對象來實例化tbxml對象

    例如:TBXML * tbxml = [[TBXML alloc] initWithXMLData:myXMLData];

    ?

    - (id)initWithURL:(NSURL*)aURL

    用一個URL來實例化一個tbxml

    例如:tbxml = [[TBXML alloc] initWithURL:[NSURL URLWithString:@"http://www.ifanr.com/feed"]];

    ?

    ?

    2.成員方法

    ?

    + (TBXMLElement*) childElementNamed:(NSString*)aName parentElement:(TBXMLElement*)aParentXMLElement

    獲得aParentXMLElement元素的首個名字為aName的元素

    例如:TBXMLElement * author = [TBXML childElementNamed:@"author" parentElement:rootXMLElement];

    ?

    + (TBXMLElement*) nextSiblingNamed:(NSString*)aName searchFromElement:(TBXMLElement*)aXMLElement

    返回下一個名為aName的兄弟元素

    例如:TBXMLElement * author = [TBXML nextSiblingNamed:@"author" searchFromElement:author];

    ?

    + (NSString*) valueOfAttributeNamed:(NSString *)aName forElement:(TBXMLElement*)aXMLElement

    返回aXMLElement元素中,名為aName的屬性的屬性值。

    例如:NSString * authorName = [TBXML valueOfAttributeNamed:@"name" forElement:authorElement];

    ?

    + (NSString*) textForElement:(TBXMLElement*)aXMLElement

    返回元素aXMLElement的text值

    例如:NSString * bookDescription = [TBXML textForElement:bookElement];

    ?

    + (NSString*) elementName:(TBXMLElement*)aXMLElement;

    返回元素aXMLElement的標簽名

    例如:NSString * elementName = [TBXML elementName:element];

    ?

    + (NSString*) attributeName:(TBXMLAttribute*)aXMLAttribute;

    返回屬性aXMLAttribute的屬性名

    例如:NSString * attributeName = [TBXML attributeName:attribute];

    ?

    + (NSString*) attributeValue:(TBXMLAttribute*)aXMLAttribute;

    返回屬性aXMLAttribute的屬性值

    例如:NSString * attributeValue = [TBXML attributeValue:attribute];

    ?

    常用的基本就這些,通過合理的迭代,遞歸等組合調用,基本可以解決所有的解析問題。

    ?

    ?

    關聯:iOS中XML解析 (二) libxml2(實例:打印xml內容及存儲到數組)?

    ?

    • TBXML.zip?(11.5 KB)
    • 下載次數: 81
    • TBXML-Books.zip?(54.1 KB)
    • 下載次數: 69
    • KissXML-5.0-0-g8256048.zip?(94.2 KB)
    • 下載次數: 33
    • TouchCode-TouchXML-0.1-NonARC-1-g540e643.zip?(1.1 MB)
    • 下載次數: 29
    • tinyxml_2_6_2.zip?(284.1 KB)
    • 下載次數: 26
    • GDataXML.zip?(15.2 KB)
    • 下載次數: 43

    總結

    以上是生活随笔為你收集整理的iOS中XML解析汇总的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。