分享

使用Gdata解析xml

 叹落花 2015-01-01

转载自:点击打开链接

@GDataXMLNode是Google提供的用于XML数据处理的类集。该类集对libxml2-DOM处理方式进行了封装能对较小或中等的XML文档进行读写操作且支持XPath语法。

    1.http://code.google.com/p/gdata-objectivec-client/source/browse/trunk/Source/XMLSupport/,获得GDataXMLNode.h和GDataXMLNode.m文件,进行如下操作将文件导入到Xcode的工程中:

    2.将GDataXMLNode.h/m文件添加到工程中;

    3.向工程中增加“libxml2.dylib”库;

    4.在工程的“Build Settings”页中找到“Header Search Path”项,添加“/usr/include/libxml2”到其路径


    5.搜索框中搜索Other linker flags,同样的方式添加-lxml2



@代码示例:

      首先在工程中新建一个xml文件,作为我们要解析的对象,新建方法是在工程中新建一个Empty的文件,命名为Student.txt(可以命名为.xml,这个随意),然后添加内容:

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <Students class="17班" school="中国">  
  3.  <student>  
  4.    <number>1</number>  
  5.    <name>胡明涛</name>  
  6.    <sex></sex>  
  7.    <phone>123558</phone>  
  8.  </student>  
  9.  <student>  
  10.    <number>2</number>  
  11.    <name>成风采</name>  
  12.    <sex></sex>  
  13.    <phone>122323</phone>  
  14.  </student>  
  15.  <student>  
  16.    <number>3</number>  
  17.    <name>陈咬金</name>  
  18.    <sex></sex>  
  19.    <phone>21313558</phone>  
  20.  </student>  
  21.  <student sign="非应届生">  
  22.    <number>4</number>  
  23.    <name>天天下</name>  
  24.    <sex></sex>  
  25.    <phone>56453558</phone>  
  26.  </student>  
  27. </Students>  

[objc] view plaincopy在CODE上查看代码片派生到我的代码片
  1. #pragma mark - GDataXMLNode  
  2. - (void)onClickGDataXMLButton{  
  3.       
  4.     // 获取工程目录的xml文件  
  5.     NSData * xmlData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Student" ofType:@"txt"]];  
  6.       
  7.     // 从文档中读出完整的XML数据,在内存中形成完整的树形结构  
  8.     NSError * error = nil;  
  9.     GDataXMLDocument * documents = [[GDataXMLDocument alloc]initWithData:xmlData options:0 error:&error];  
  10.       
  11.     // 取得根节点(element元素)---Students  
  12.     GDataXMLElement * rootEL = [documents rootElement];  
  13.     
  14.     // 获取根节点下的节点,返回的数组---student  
  15.     NSArray * studentsArray = [rootEL elementsForName:@"student"];  
  16.     for (int i = 0; i < [studentsArray count]; i++) {  
  17.           
  18.         // 获取单个节点对象  
  19.         GDataXMLElement * student = [studentsArray objectAtIndex:i];  
  20.           
  21.         // 获取student节点下name,number,sex,phone节点的值  
  22.         GDataXMLElement * nameElement = [[student elementsForName:@"name"] lastObject];  
  23.         GDataXMLElement * sexElement = [[student elementsForName:@"sex"]lastObject];  
  24.         GDataXMLElement * numberElement = [[student elementsForName:@"number"]lastObject];  
  25.         GDataXMLElement * phoneElement = [[student elementsForName:@"phone"]lastObject];  
  26.         NSString * name = [nameElement stringValue];  
  27.         NSString * number = [numberElement stringValue];  
  28.         NSString * sex = [sexElement stringValue];  
  29.         NSString * phone = [phoneElement stringValue];  
  30.           
  31.         // 读标签里面的属性(attributeForName)  
  32.         NSString * sign = [[student attributeForName:@"sign"]stringValue];  
  33.         if (sign) {  
  34.             NSLog(@"----------%@",sign);  
  35.         }  
  36.           
  37.         NSLog(@"%@,%@,%@,%@",number,name,sex,phone);  
  38.     }  
  39.      
  40. #pragma mark  通过路径,取得指定的节点值,所有节点中同一标签的值  
  41.     // 一个是相对路径,一个是绝对路径-----------(nodesForXPath)  
  42.     //NSArray * nameArray = [rootEL nodesForXPath:@"//name" error:nil];  
  43.     NSArray * nameArray = [rootEL nodesForXPath:@"student/name" error:nil];  
  44.     for (int i = 0; i < [nameArray count]; i++) {  
  45.   
  46.         NSString * name = [[nameArray objectAtIndex:i] stringValue];  
  47.           
  48.         NSLog(@"---%@",name);  
  49.     }  
  50.       
  51.     
  52. }  


[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0"?>  
  2. <xml_api_reply version="1">  
  3.     <cities>  
  4.         <city>  
  5.             <name data="保定"/>  
  6.             <latitude_e6> 38849998</latitude_e6>  
  7.             <longitude_e6> 115569999</longitude_e6>  
  8.         </city>  
  9.         <city default="true" >  
  10.             <name data="北京"/>  
  11.             <latitude_e6> 39930000</latitude_e6>  
  12.             <longitude_e6> 116279998</longitude_e6>  
  13.         </city>  
  14.         <city>  
  15.             <name data="沈阳"/>  
  16.             <latitude_e6> 41770000</latitude_e6>  
  17.             <longitude_e6> 123430000</longitude_e6>  
  18.         </city>  
  19.         <city>  
  20.             <name data="成都"/>  
  21.             <latitude_e6> 30670000</latitude_e6>  
  22.             <longitude_e6> 104019996</longitude_e6>  
  23.         </city>  
  24.         <city>  
  25.             <name data="大连"/>  
  26.             <latitude_e6> 38900001</latitude_e6>  
  27.             <longitude_e6> 121629997</longitude_e6>  
  28.         </city>  
  29.         <city>  
  30.             <name data="福州"/>  
  31.             <latitude_e6> 26079999</latitude_e6>  
  32.             <longitude_e6> 119279998</longitude_e6>  
  33.         </city>  
  34.         <city>  
  35.             <name data="阜阳"/>  
  36.             <latitude_e6> 32930000</latitude_e6>  
  37.             <longitude_e6> 115830001</longitude_e6>  
  38.         </city>  
  39.         <city>  
  40.             <name data="赣州"/>  
  41.             <latitude_e6> 25850000</latitude_e6>  
  42.             <longitude_e6> 114949997</longitude_e6>  
  43.         </city>  
  44.         <city>  
  45.             <name data="广州"/>  
  46.             <latitude_e6> 23129999</latitude_e6>  
  47.             <longitude_e6> 113319999</longitude_e6>  
  48.         </city>  
  49.         <city>  
  50.             <name data="贵阳"/>  
  51.             <latitude_e6> 26579999</latitude_e6>  
  52.             <longitude_e6> 106720001</longitude_e6>  
  53.         </city>  
  54.         <city>  
  55.             <name data="哈尔滨"/>  
  56.             <latitude_e6> 45750000</latitude_e6>  
  57.             <longitude_e6> 126769996</longitude_e6>  
  58.         </city>  
  59.         <city>  
  60.             <name data="海口"/>  
  61.             <latitude_e6> 20030000</latitude_e6>  
  62.             <longitude_e6> 110349998</longitude_e6>  
  63.         </city>  
  64.         <city>  
  65.             <name data="邯郸"/>  
  66.             <latitude_e6> 38029998</latitude_e6>  
  67.             <longitude_e6> 114419998</longitude_e6>  
  68.         </city>  
  69.         <city>  
  70.             <name data="杭州"/>  
  71.             <latitude_e6> 30229999</latitude_e6>  
  72.             <longitude_e6> 120169998</longitude_e6>  
  73.         </city>  
  74.         <city>  
  75.             <name data="合肥"/>  
  76.             <latitude_e6> 31870000</latitude_e6>  
  77.             <longitude_e6> 117230003</longitude_e6>  
  78.         </city>  
  79.         <city>  
  80.             <name data="菏泽"/>  
  81.             <latitude_e6> 36119998</latitude_e6>  
  82.             <longitude_e6> 114370002</longitude_e6>  
  83.         </city>  
  84.         <city>  
  85.             <name data="衡阳"/>  
  86.             <latitude_e6> 36119998</latitude_e6>  
  87.             <longitude_e6> 114370002</longitude_e6>  
  88.         </city>  
  89.     </cities>  
  90. </xml_api_reply>  

[objc] view plaincopy在CODE上查看代码片派生到我的代码片
  1. #pragma mark - 解析citys  
  2. - (void)parseCitys{  
  3.   
  4.     NSData * xmlCitysData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"citys" ofType:@"xml"]];  
  5.       
  6.     // 从文档中读取完成的XML文档,在内存中形成完整的树形结构  
  7.     NSError * error = nil;  
  8.     GDataXMLDocument * documents = [[GDataXMLDocument alloc]initWithData:xmlCitysData options:0 error:&error];  
  9.   
  10.     // 取得根节点  
  11.     GDataXMLElement * rootNode = [documents rootElement];  
  12.   
  13. #pragma mark 获取根节点xml_api_reply的数组,包含的是cities  
  14.     NSArray * citiesArray = [rootNode elementsForName:@"cities"];  
  15.     for (int i = 0; i < [citiesArray count]; i++) {  
  16.        
  17.         // 取得单个cities节点  
  18.         GDataXMLElement * cities = [citiesArray objectAtIndex:i];  
  19.           
  20. #pragma mark 获取节点cities的数组,包含的是city  
  21.         NSArray * cityArray = [cities elementsForName:@"city"];  
  22.         for (int j = 0; j < [cityArray count]; j++) {  
  23.               
  24.             // 取得单个city节点  
  25.             GDataXMLElement * city = [cityArray objectAtIndex:j];  
  26.               
  27. #pragma mark city节点下面是3个并行的节点,都是1个,直接通过lastObject来取得想要的值  
  28.               
  29.             NSString * name = [[[[city elementsForName:@"name"]lastObject] attributeForName:@"data"] stringValue];  
  30.             NSLog(@"name = %@",name);  
  31.               
  32.             NSString * latitude_e6 = [[[city elementsForName:@"latitude_e6"]lastObject] stringValue];  
  33.             NSLog(@"latitude_e6 = %@",latitude_e6);  
  34.               
  35.             NSString * longitude_e6 = [[[city elementsForName:@"longitude_e6"]lastObject] stringValue];  
  36.             NSLog(@"longitude_e6 = %@",longitude_e6);  
  37.               
  38.         }  
  39.           
  40.     }  
  41.       
  42. }  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约