兩種方法:1.ios中現有的NSXMLParse類
2.Google的GDataXML也是基於libxml2的,因此在使用GDataXML之前需要導入libxml2。
以下是ios中nsxmlparse的詳細說明:
NSxmlParser實現sax方法來解析XML文件。
dom實現的原理是壹次性讀取整個xml文檔並將其放入樹結構中。必要時,找到特定的節點,然後讀取或寫入該節點。他的主要優點是簡單和讀寫平衡;缺點是占用更多內存,因為他必須將整個xml文檔讀入內存。文件越大,這種缺點越明顯。
Sax的實現不同於dom。他只在xml文檔中尋找特定條件的內容,並且只提取所需的內容。它占用內存少且靈活,正好滿足我們的需求。他的弱點是寫作。有些資料介紹了寫作的方法,但我認為這個例子沒有必要。
運行NSXMLParser包括設置、運行和響應結果。
1)啟動NSXMLParser。
要使用NSXMLParser,必須首先創建它並設置各種屬性,主要使用以下方法:
InitWithContentsOfURL通過NSURL創建壹個解析器。
InitWithData通過NSData創建壹個解析器。
SetDelegate為解析器定義壹個委托。
解析運行解析器。
擔任代表
五種最重要的方法:
//用於查找元素開頭(即報告元素開頭及其屬性)的處理程序
-(void)解析器:(NSXMLParser *)解析器
did startelement:(ns string *)element name
namespace uri:(ns string *)namespace uri
qualified name:(ns string *)qName
屬性:(ns dictionary *)attributeDict
//處理標記包含內容字符(報告元素的全部或部分內容)
-(void)解析器:(NSXMLParser *)解析器發現字符:(NSString *)字符串
//用於查找元素終止符的處理程序,它保存元素的每壹項的數據(即報告元素的結束標記)。
-(void)解析器:(NSXMLParser *)解析器
didend element:(ns string *)element name
namespace uri:(ns string *)namespace uri
qualified name:(ns string *)qName
//報告解析結束
-(void)parserdinddocument:(nsxml parser *)解析器
//報告不可恢復的解析錯誤
-(void)paser:出現解析錯誤
1.陳述了壹個xml處理協議,它使用NSxmlParser協議專門處理我們要解析的XML文件,取出所需的url並將其存儲在指定的數據中。
*/
//多線程類的定義、方法實現以及向主線程發回數據。
@ class AppRecord
//@ protocol ParseOperationDelegate;
@ protocol ParseOperationDelegate
-(void)did finish parsing:(NSArray *)appList;
-(void)parse error occurred:(NSError *)錯誤;
@end
@ interface parse operation:ns operation {
@私人
id & lt& lt/span>。ParseOperationDelegate & gt委派;//,NSXMLParserDelegate
NSData * dataToParse
NSMutableArray * workingArray
AppRecord * workingEntry
NSMutableString * working property string;
NSArray * elementsToParse
BOOL storingCharacterData
}
-(id)initWithData:(ns data *)數據委托:(id & lt& ltspan class =“s 13“& gt。ParseOperationDelegate & gt)委托人;
@end
然後完成協議的初始化功能。
-(id)initWithData:(ns data *)數據委托:(id & lt& ltspan class =“s 13“& gt。ParseOperationDelegate & gt委托人
{
self =【超級初始化】;
如果(自我!=零)
{
self.dataToParse = data
self.delegate = theDelegate
self . elements parse =【NSArray arrayWithObjects:kIDStr,kNameStr,kImageStr,kArtistStr,nil】;
}
回歸自我;
}
2.完成特定標簽的解析。
#雜註標記-
#雜註標記RSS處理
-(void)解析器:(NSXMLParser *)解析器did startelement:(ns string *)element name
namespace uri:(ns string *)namespace uri
qualified name:(ns string *)qName
屬性:(ns dictionary *)attributeDict
{
// entry: { id(鏈接),im:name(應用程序名稱),im:image(可變高度)}
//
if(【element name is qualto string:kentry str】)
{
self . working entry =【【apprecto alloc】init】auto release】;
}
storingCharacterData =【elements parse contains object:element name】;
}
3.找到具體地址和內容並存儲。
-(void)解析器:(NSXMLParser *)解析器didend element:(ns string *)element name
namespace uri:(ns string *)namespace uri
qualified name:(ns string *)qName
{
if(self . work ingentry)
{
if(storingCharacterData)
{
ns string * trimmed string =【working property string stringByTrimmingCharactersInSet:
【NSCharacterSet whitespacandnewlinecharacterset】】;
【workingPropertyString set string:@““】;//為下次清除字符串
if(【element name isEqualToString:kIDStr】)
{
self . working entry . app urlstring = trimmed string;
}
else if(【element name is equal tostring:kNameStr】)
{
self . working entry . appname = trimmed string;
}
else if(【element name isEqualToString:kImageStr】)
{
self . working entry . imageurlstring = trimmed string;
}
else if(【element name is equal tostring:kArtistStr】)
{
self . working entry . artist = trimmed string;
}
}
else if(【element name is equal tostring:kentry str】)
{
【self . working array add object:self . working entry】;
self.workingEntry = nil
}
}
}
-(void)解析器:(NSXMLParser *)解析器發現字符:(NSString *)字符串
{
if(storingCharacterData)
{
【working property string append string:string】;
}
}
第三方解決方法::::::::
簡介:由KissXML的第三方組裝實現,需要介紹libxml2.dylib。
(另請註意,運行時可能會提示“找不到libxml/tree.h”。
解決方案:在項目的目標中選擇壹個目標,切換到右側的構建設置頁面,然後向下搜索。
Paths段,其中有壹個標題搜索路徑項,其值設置為:/usr/include/libxml2),如下所示:
ProvinceCity.xml的文件格式如下:
該程序的主要代碼如下:
#導入“DDXML.h“
# import“ddxmlelementadditions . h“
@實現視圖控制器
//解析XML
staticNSString * kXML = @“//區//省“;
-(void)viewDidLoad
{
【superviewDidLoad】;
ns string * path =【【NSString galloc】init withstring:【【NSBundlemainBundle】path for resource:@“province city“of type:@“XML“】】;
ns data * data =【【ns data alloc】initwithcontentsofile:path】;
【self parseddatafromdata:dataandprovince:@“江西省”】;
【self parseddatafromdata:data】;
【數據發布】;
}
//取特定省份下的所有城市。
-(void)parsedDataFromData:(ns data *)data and province:(ns string *)province {
ddxml document * doc =【【ddxml document alloc】initWithData:data options:0 error:nil】;
////解析
NSArray * items =【docnodesForXPath:kxml error:nil】;
對於(ddxml element * objin items ){
DD xmlnode * aUser =【obj attribute for Name:@“Name“】;//取屬性名的值。
if(【auser . stringvalueisequaltostring:province】)
{
NSArray * City lst =【obj elements forname:@“City“】;//獲取城市點列表並將其保存在數組中。
if(city lst . count & gt;0)//二樓
{
for(ddxml element * city in city lst ){
DD xmlnode * city node =【city s attribute for Name:@“Name“】;
NSLog(“% @”“,city node . string value);
}
}
}
}
【文檔發布】;
}
//獲取所有省份及其下屬節點,包括修改。
-(void)parsedDataFromData:(ns data *)data {
ddxml document * doc =【【ddxml document alloc】initWithData:data options:0 error:nil】;
////解析
NSArray * items =【docnodesForXPath:kxml error:nil】;
對於(ddxml element * objin items ){
DD xmlnode * aUser =【objatributeforname:@“Name“】;//取屬性名的值。
//【aUser setStringValue:@“哈哈!”];//修改屬性節點的值
【objaddAttribute:【ddxmlnode attribute with name:@“test“string value:@“wzh“】】;//添加屬性節點
【objaddAttributeWithName:@“TTT“string value:@“343“】;//添加另壹個屬性節點。
//【obj setstring value:@“new node“】;//設置當前節點的值
DD xmlnode * new node =【DDXMLNodeelementWithName:@“new node“】;//設置新節點
【obj addChild:new node】;//向對象添加節點
ddxml element * newdxml =【【objelementsForName:@“new node“】objectAtIndex:0】;//訪問剛剛添加的節點。
【newdxmladattributewithname:@“node two“string value:@“two value“】;//向新添加的節點添加壹個額外的從屬節點,該從屬節點具有另壹個屬性值。
DD xmlnode * new node 2 =【DDXMLNodeelementWithName:@“new node 2“string value:@“hello!“];
【newdxmladchild:new node 2】;
}
//保存到沙盒目錄
ns string * path =【【NSStringalloc】initWithFormat:@“% @/XML data . XML“,【NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)objectAtIndex:0】;
ns string * result =【【NSStringalloc】initWithFormat:@“% @”,doc】;
【resultwriteToFile:path atomic:yes encoding:nsu TF 8 string encoding error:nil】;
//【result 2 write tofile:path atomic:YES】;//這個方法不行,保存後會有亂碼。
【成績發布】;
【路徑釋放】;
【文檔發布】;
}