IOS SDK自带的XML解析库 libxml2使用方法(转)

IOS SDK自带的XML解析库 libxml2使用方法如下:
准备工作:
1、Xcode4.3.2,新建测试应用libxmltest。
2、把libxml包添加到项目中去。


3、PROJECT=>Build Setting => Searche Paths=>Header Search Paths:把这个拷贝进去${SDKROOT}/usr/include/libxml2。


4、PROJECT=>Build Setting =>Linking => OTHER_LDFLAGS:把这个拷贝进去-lxml2。


一、使用libxml读XML文件

要读xml,需要使用reader,这里介绍两种方式,一种从文件读取,一种从内存读取。其它就是通过libxml库中提供的两个API来建立reader.请看代码:
1、从文件建立reader
xmlTextReaderPtr  reader = xmlNewTextReaderFilename(xmlfile);  
2、从内存建立reader
// char* memory, int size     
xmlTextReaderPtr reader = xmlReaderForMemory(const char *buffer, int size, const char *URL, const char *encoding, int options);
3、从reader中读数据
建立了reader之后,我们就可以通过reader的辅助函数来实现xml数据的读取。在这里,我讲述的是如何读一个文本方式的XML,并没有使用XML的专有模型。这种方式最原始,也是最容易理解的。
要读一个reader中的数据,使用xmlTextReaderRead来读一个元素,XML中的每一个元素都会经过reader依次读取,我们可以根据需要来检查当前reader位置的元素类型,并取出数据为已所用,当然还要释放由reader分配的数据空间。下面来看一下读的例子:
  1. ret = xmlTextReaderRead(reader);     
  2. if (ret == 0) return 0;     
  3. if (ret != 1) return -2;     
  4. element = xmlTextReaderName(reader);          
  5. if (element != NULL)     
  6. {     
  7.     ntype = xmlTextReaderNodeType(reader);     
  8.     if (strcmp((const char*) element, "param-name") == 0)     
  9.     {     
  10.         xmlFree(element);     
  11.         if (XML_READER_TYPE_ELEMENT == ntype)     
  12.         {     
  13.         /*......*/     
  14.         }     
  15.     }     
  16. }   
复制代码
xmlTextReaderRead 需要一个参数,就是我们前面进行的一个文本读取器指针,该函数返回1表示成功读取,0表示到达文件尾。当成功读取时,可能使用xmlTextReaderName读取当前位置的元素数据,并可以通过xmlTextTextReaderNodeType来读取XML元素的类型。
  1. /**   
  2. * xmlReaderTypes:   
  3. *   
  4. * Predefined constants for the different types of nodes.   
  5. */     
  6. typedef enum {     
  7.     XML_READER_TYPE_NONE = 0,     
  8.     XML_READER_TYPE_ELEMENT = 1,     
  9.     XML_READER_TYPE_ATTRIBUTE = 2,     
  10.     XML_READER_TYPE_TEXT = 3,     
  11.     XML_READER_TYPE_CDATA = 4,     
  12.     XML_READER_TYPE_ENTITY_REFERENCE = 5,     
  13.     XML_READER_TYPE_ENTITY = 6,     
  14.     XML_READER_TYPE_PROCESSING_INSTRUCTION = 7,     
  15.     XML_READER_TYPE_COMMENT = 8,     
  16.     XML_READER_TYPE_DOCUMENT = 9,     
  17.     XML_READER_TYPE_DOCUMENT_TYPE = 10,     
  18.     XML_READER_TYPE_DOCUMENT_FRAGMENT = 11,     
  19.     XML_READER_TYPE_NOTATION = 12,     
  20.     XML_READER_TYPE_WHITESPACE = 13,     
  21.     XML_READER_TYPE_SIGNIFICANT_WHITESPACE = 14,     
  22.     XML_READER_TYPE_END_ELEMENT = 15,     
  23.     XML_READER_TYPE_END_ENTITY = 16,     
  24.     XML_READER_TYPE_XML_DECLARATION = 17     
  25. } xmlReaderTypes;  
复制代码
reader支持如上类型,我们可以根据当前类型来读取数据,因为不现的类型,读取数据的方式不同,比如xmlTextReaderReadString只能读元素(XML_READER_TYPE_ELEMENT)的名称或者文件类型(XML_READER_TYPE_TEXT)的数据。注意一点就是reader是按顺序读取每一个元素,在写代码时,应该不要假定后面一定是什么元素或者特定类型,应该去检测,保证软件的稳定性。
使用xmlTextReaderReadString返回一个元素(xmlChar*类型)时,该区域是由库分配的内存区域,需要使用xmlFree来释放,不然就有内存泄漏。
4、读xml的reader的释放与清理
xmlTextReaderClose(reader);     
xmlFreeTextReader(reader);     
xmlDictCleanup();     
xmlCleanupParser();     
xmlMemoryDump();     
xmlCleanupCharEncodingHandlers();     
有一个xmlTextReaderClose函数,当使用该函数时,要注意顺序,一定要在xmlFreeTextReader之前,不然就会出现错误。
二、例子
  1. self.nsData(NSData数据类型) = [theRequest responseData];//通过网络(WebService等接口获取的XML数据)         
  2. xmlTextReaderPtr reader = xmlReaderForMemory ([self.nsData bytes], [self.nsData length], nil, nil,             (XML_PARSE_NOENT|XML_PARSE_NOBLANKS | XML_PARSE_NOCDATA | XML_PARSE_NOERROR | XML_PARSE_NOWARNING));  //创建Reader
  3. if (!reader) {  
  4.         NSLog(@"Failed to load xmlreader");  
  5. }  
  6.         NSString *currentTagName = nil;  
  7.         NSString *currentTagValue = nil;  
  8.         NSString *parentTagName = nil;  
  9.         bool itemStarted = false;  
  10.         char* temp;  
  11.         while (true) {  
  12.             if (!xmlTextReaderRead(reader))   
  13.                 break;  
  14.             int type = xmlTextReaderNodeType(reader);  
  15.             switch (type) {  
  16.                     
  17.                 case XML_READER_TYPE_END_ELEMENT:  
  18.                     temp =  (char*)xmlTextReaderConstName(reader);  
  19.                     currentTagName = [NSString stringWithCString:temp   
  20.                                                         encoding:NSUTF8StringEncoding];  
  21.                     if ([currentTagName isEqualToString:@"userInfo"]) {  
  22.                         itemStarted = false;  
  23.                         [self operateCompUser:compUser];//处理解析的数据
  24.                         [compUser release];
  25.                         compUser = [[CompUser alloc]init];
  26.                     }
  27.                     else if ([currentTagName isEqualToString:@"groupInfo"]) {  
  28.                         itemStarted = false;  
  29.                         [self operateCompDept:compDept]; //处理解析的数据
  30.                         [compDept release];
  31.                         compDept = [[CompDept alloc]init];
  32.                     }    
  33.                     continue;  
  34.                     
  35.                 case XML_READER_TYPE_ELEMENT:  
  36.                     temp =  (char*)xmlTextReaderConstName(reader);  
  37.                     currentTagName = [NSString stringWithCString:temp   
  38.                                                         encoding:NSUTF8StringEncoding];  
  39.                     if ([currentTagName isEqualToString:@"userInfo"]||[currentTagName isEqualToString:@"groupInfo"]) {  
  40.                         parentTagName = currentTagName;
  41.                         itemStarted = true; 
  42.                     }  
  43.                     continue;  
  44.                     
  45.                 case XML_READER_TYPE_TEXT:  
  46.                     if(itemStarted == false)  
  47.                         continue;  
  48.                     temp = (char*)xmlTextReaderConstValue(reader);  
  49.                     currentTagValue = [NSString stringWithCString:temp   
  50.                                                          encoding:NSUTF8StringEncoding];  
  51.                     if ([parentTagName isEqualToString:@"userInfo"]) {
  52.                         if ([currentTagName isEqualToString:@"operateType"]) {
  53.                             compUser.operateType=currentTagValue;
  54.                         }
  55.                         else if ([currentTagName isEqualToString:@"uid"]) {
  56.                             compUser.uId=currentTagValue;
  57.                         }
  58.                         else if ([currentTagName isEqualToString:@"cn"]) {
  59.                             compUser.cn=currentTagValue;
  60.                         }
  61.                         else if ([currentTagName isEqualToString:@"mobile"]) {
  62.                             compUser.mobile=currentTagValue;
  63.                         }
  64.                         else if ([currentTagName isEqualToString:@"telephoneNumber"]) {
  65.                             compUser.telephoneNumber=currentTagValue;
  66.                         }
  67.                         else if ([currentTagName isEqualToString:@"departmentNumber"]) {
  68.                             compUser.departmentNumber=currentTagValue;
  69.                         }
  70.                         else if ([currentTagName isEqualToString:@"deptName"]) {
  71.                             compUser.deptName=currentTagValue;
  72.                         }
  73.                         else if ([currentTagName isEqualToString:@"coName"]) {
  74.                             compUser.coName=currentTagValue;
  75.                         }
  76.                         else if ([currentTagName isEqualToString:@"coNo"]) {
  77.                             compUser.coNo=currentTagValue;
  78.                         }
  79.                         else if ([currentTagName isEqualToString:@"cuOrder"]) {
  80.                             compUser.cuOrder=currentTagValue;
  81.                         }
  82.                         else if ([currentTagName isEqualToString:@"cuMail"]) {
  83.                             compUser.cuMail=currentTagValue;
  84.                         }
  85.                         else if ([currentTagName isEqualToString:@"cuAllShow"]) {
  86.                             compUser.cuAllShow=currentTagValue;
  87.                         }
  88.                     }
  89.                     if ([parentTagName isEqualToString:@"groupInfo"]) {
  90.                         if ([currentTagName isEqualToString:@"operateType"]) {
  91.                             compDept.operateType=currentTagValue;
  92.                         }
  93.                         else if ([currentTagName isEqualToString:@"ou"]) {
  94.                             compDept.ou=currentTagValue;
  95.                         }
  96.                         else if ([currentTagName isEqualToString:@"name"]) {
  97.                             compDept.name=currentTagValue;
  98.                         }
  99.                         else if ([currentTagName isEqualToString:@"upId"]) {
  100.                             compDept.upId=currentTagValue;
  101.                         }
  102.                         else if ([currentTagName isEqualToString:@"cuCompanyNumber"]) {
  103.                             compDept.cuCompanyNumber=currentTagValue;
  104.                         }
  105.                         else if ([currentTagName isEqualToString:@"cuAllShow"]) {
  106.                             compDept.cuAllShow=currentTagValue;
  107.                         }
  108.                         else if ([currentTagName isEqualToString:@"cuOrder"]) {
  109.                             compDept.cuOrder=currentTagValue;
  110.                         }
  111.                     }
  112. //self.nsCompData(NSData) =  [currentTagValue dataUsingEncoding:NSUTF8StringEncoding];
  113.                     currentTagValue = nil;  
  114.                     currentTagName = nil;  
  115.                     continue;  
  116.                 case XML_READER_TYPE_ATTRIBUTE: 
  117.                 default:   
  118.                     continue;  
  119.             }  
  120.         } 
  121.         reader = nil;
  122.     }
复制代码
XML数据格式如下:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <info>
  3. <userTotal>37</userTotal>
  4. <groupInfo>
  5. <operateType>add</operateType>
  6. <ou>33491028635</ou>
  7. <name>XXX市分公司信息化服务中心</name>
  8. <upId>33422</upId>
  9. <cuCompanyNumber>33422</cuCompanyNumber>
  10. <cuAllShow>TRUE</cuAllShow>
  11. <cuOrder>999</cuOrder>
  12. </groupInfo>
  13. <userInfo>
  14. <operateType>add</operateType>
  15. <uid>sd-shen</uid>
  16. <cn>某某某</cn>
  17. <departmentNumber>33491055</departmentNumber>
  18. <deptName>网络公司XXX市分公司XXXX响应中心</deptName>
  19. <coNo>33491</coNo>
  20. <coName>XXX市分公司</coName>
  21. <cuOrder>999</cuOrder>
  22. <mobile>15655552211</mobile>
  23. <cuMail>sd@china.cn</cuMail>
  24. <cuAllShow>TRUE</cuAllShow>
  25. </userInfo>
  26. </info>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值