`
ytwhw
  • 浏览: 97259 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

IOS中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分配的数据空间。下面来看一下读的例子:

ret = xmlTextReaderRead(reader);     

if (ret == 0) return 0;     

if (ret != 1) return -2;     

element = xmlTextReaderName(reader);          

if (element != NULL)     

{     

    ntype = xmlTextReaderNodeType(reader);     

    if (strcmp((const char*) element, "param-name") == 0)     

    {     

        xmlFree(element);     

        if (XML_READER_TYPE_ELEMENT == ntype)     

        {     

        /*......*/     

        }     

    }     

}    

xmlTextReaderRead需要一个参数,就是我们前面进行的一个文本读取器指针,该函数返回1表示成功读取,0表示到达文件尾。当成功读取时,可能使用xmlTextReaderName读取当前位置的元素数据,并可以通过xmlTextTextReaderNodeType来读取XML元素的类型。

/**   

 * xmlReaderTypes:   

 *   

 * Predefined constants for the different types of nodes.   

 */     

typedef enum {     

    XML_READER_TYPE_NONE = 0,     

    XML_READER_TYPE_ELEMENT = 1,     

    XML_READER_TYPE_ATTRIBUTE = 2,     

    XML_READER_TYPE_TEXT = 3,     

    XML_READER_TYPE_CDATA = 4,     

    XML_READER_TYPE_ENTITY_REFERENCE = 5,     

    XML_READER_TYPE_ENTITY = 6,     

    XML_READER_TYPE_PROCESSING_INSTRUCTION = 7,     

    XML_READER_TYPE_COMMENT = 8,     

    XML_READER_TYPE_DOCUMENT = 9,     

    XML_READER_TYPE_DOCUMENT_TYPE = 10,     

    XML_READER_TYPE_DOCUMENT_FRAGMENT = 11,     

    XML_READER_TYPE_NOTATION = 12,     

    XML_READER_TYPE_WHITESPACE = 13,     

    XML_READER_TYPE_SIGNIFICANT_WHITESPACE = 14,     

    XML_READER_TYPE_END_ELEMENT = 15,     

    XML_READER_TYPE_END_ENTITY = 16,     

    XML_READER_TYPE_XML_DECLARATION = 17     

} xmlReaderTypes;    

reader支持如上类型,我们可以根据当前类型来读取数据,因为不现的类型,读取数据的方式不同,比如xmlTextReaderReadString只能读元素(XML_READER_TYPE_ELEMENT)的名称或者文件类型(XML_READER_TYPE_TEXT)的数据。注意一点就是reader是按顺序读取每一个元素,在写代码时,应该不要假定后面一定是什么元素或者特定类型,应该去检测,保证软件的稳定性。

使用xmlTextReaderReadString返回一个元素(xmlChar*类型)时,该区域是由库分配的内存区域,需要使用xmlFree来释放,不然就有内存泄漏。

4、读xmlreader的释放与清理

xmlTextReaderClose(reader);     

xmlFreeTextReader(reader);     

xmlDictCleanup();     

xmlCleanupParser();     

xmlMemoryDump();     

xmlCleanupCharEncodingHandlers();     

有一个xmlTextReaderClose函数,当使用该函数时,要注意顺序,一定要在xmlFreeTextReader之前,不然就会出现错误。

二、例子

self.nsData(NSData数据类型) = [theRequest responseData];//通过网络(WebService等接口获取的XML数据)         
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
if (!reader) {  
        NSLog(@"Failed to load xmlreader");  
}  
        NSString *currentTagName = nil;  
        NSString *currentTagValue = nil;  
        NSString *parentTagName = nil;  
        bool itemStarted = false;  
        char* temp;  
        while (true) {  
            if (!xmlTextReaderRead(reader))   
                break;  
            int type = xmlTextReaderNodeType(reader);  
            switch (type) {  
                    
                case XML_READER_TYPE_END_ELEMENT:  
                    temp =  (char*)xmlTextReaderConstName(reader);  
                    currentTagName = [NSString stringWithCString:temp   
                                                        encoding:NSUTF8StringEncoding];  
                    if ([currentTagName isEqualToString:@"userInfo"]) {  
                        itemStarted = false;  
                        [self operateCompUser:compUser];//处理解析的数据
                        [compUser release];
                        compUser = [[CompUser alloc]init];
                    }
                    else if ([currentTagName isEqualToString:@"groupInfo"]) {  
                        itemStarted = false;  
                        [self operateCompDept:compDept]; //处理解析的数据
                        [compDept release];
                        compDept = [[CompDept alloc]init];
                    }    
                    continue;  
                    
                case XML_READER_TYPE_ELEMENT:  
                    temp =  (char*)xmlTextReaderConstName(reader);  
                    currentTagName = [NSString stringWithCString:temp   
                                                        encoding:NSUTF8StringEncoding];  
                    if ([currentTagName isEqualToString:@"userInfo"]||[currentTagName isEqualToString:@"groupInfo"]) {  
                        parentTagName = currentTagName;
                        itemStarted = true; 
                    }  
                    continue;  
                    
                case XML_READER_TYPE_TEXT:  
                    if(itemStarted == false)  
                        continue;  
                    temp = (char*)xmlTextReaderConstValue(reader);  
                    currentTagValue = [NSString stringWithCString:temp   
                                                         encoding:NSUTF8StringEncoding];  
                    if ([parentTagName isEqualToString:@"userInfo"]) {
                        if ([currentTagName isEqualToString:@"operateType"]) {
                            compUser.operateType=currentTagValue;
                        }
                        else if ([currentTagName isEqualToString:@"uid"]) {
                            compUser.uId=currentTagValue;
                        }
                        else if ([currentTagName isEqualToString:@"cn"]) {
                            compUser.cn=currentTagValue;
                        }
                        else if ([currentTagName isEqualToString:@"mobile"]) {
                            compUser.mobile=currentTagValue;
                        }
                        else if ([currentTagName isEqualToString:@"telephoneNumber"]) {
                            compUser.telephoneNumber=currentTagValue;
                        }
                        else if ([currentTagName isEqualToString:@"departmentNumber"]) {
                            compUser.departmentNumber=currentTagValue;
                        }
                        else if ([currentTagName isEqualToString:@"deptName"]) {
                            compUser.deptName=currentTagValue;
                        }
                        else if ([currentTagName isEqualToString:@"coName"]) {
                            compUser.coName=currentTagValue;
                        }
                        else if ([currentTagName isEqualToString:@"coNo"]) {
                            compUser.coNo=currentTagValue;
                        }
                        else if ([currentTagName isEqualToString:@"cuOrder"]) {
                            compUser.cuOrder=currentTagValue;
                        }
                        else if ([currentTagName isEqualToString:@"cuMail"]) {
                            compUser.cuMail=currentTagValue;
                        }
                        else if ([currentTagName isEqualToString:@"cuAllShow"]) {
                            compUser.cuAllShow=currentTagValue;
                        }
                    }
                    if ([parentTagName isEqualToString:@"groupInfo"]) {
                        if ([currentTagName isEqualToString:@"operateType"]) {
                            compDept.operateType=currentTagValue;
                        }
                        else if ([currentTagName isEqualToString:@"ou"]) {
                            compDept.ou=currentTagValue;
                        }
                        else if ([currentTagName isEqualToString:@"name"]) {
                            compDept.name=currentTagValue;
                        }
                        else if ([currentTagName isEqualToString:@"upId"]) {
                            compDept.upId=currentTagValue;
                        }
                        else if ([currentTagName isEqualToString:@"cuCompanyNumber"]) {
                            compDept.cuCompanyNumber=currentTagValue;
                        }
                        else if ([currentTagName isEqualToString:@"cuAllShow"]) {
                            compDept.cuAllShow=currentTagValue;
                        }
                        else if ([currentTagName isEqualToString:@"cuOrder"]) {
                            compDept.cuOrder=currentTagValue;
                        }
                    }
//self.nsCompData(NSData) =  [currentTagValue dataUsingEncoding:NSUTF8StringEncoding];
                    currentTagValue = nil;  
                    currentTagName = nil;  
                    continue;  
                case XML_READER_TYPE_ATTRIBUTE: 
                default:   
                    continue;  
            }  
        } 
        reader = nil;
    }

 XML数据格式如下:

<?xml version="1.0" encoding="UTF-8"?>
<info>
<userTotal>37</userTotal>
<groupInfo>
<operateType>add</operateType>
<ou>33491028635</ou>
<name>XXX</name>
<upId>XXXX</upId>
<cuCompanyNumber>XXXX</cuCompanyNumber>
<cuAllShow>TRUE</cuAllShow>
<cuOrder>999</cuOrder>
</groupInfo>
<userInfo>
<operateType>add</operateType>
<uid>sd-shen</uid>
<cn>某某某</cn>
<departmentNumber>33491055</departmentNumber>
<deptName>XXXXX</deptName>
<coNo>33491</coNo>
<coName>XXXXXXX</coName>
<cuOrder>999</cuOrder>
<mobile>15655552211</mobile>
<cuMail>XXX@XXX.cn</cuMail>
<cuAllShow>TRUE</cuAllShow>
</userInfo>
</info>

 

  • 大小: 85.9 KB
  • 大小: 86.6 KB
  • 大小: 79 KB
分享到:
评论

相关推荐

    iOS解析xml通用类

    解析xml文件的通用类,使用libxml实现边下载边解析,下载使用ASI开源库. 可以设置最外边需要解析的tag

    iOS开发使用XML解析网络数据

    2、IOS中XML解析方案有很多种:  2-1、第三方框架:  libxml2:纯C语言,默认包含在iOS SDK中,同时支持DOM和SAX解析  GDataXML:DOM方式解析,由Google开发,基于libxml2  2-2、苹果原生  NSXMLParser:SAX...

    iOS开发中常见的解析XML的类库以及简要安装方法

    在iPhone开发中,XML的解析有很多选择,iOS SDK提供了NSXMLParser和libxml2两个类库,另外还有很多第三方类库可选,例如TBXML、TouchXML、KissXML、TinyXML和GDataXML。问题是应该选择哪一个呢? 解析 XML 通常有两...

    Swift的XML / HTML解析器-Swift开发

    功能构建XML / HTML树并导航XPath查询支持的全面单元测试覆盖范围CSS选择器(正在进行中)Usag XML XML是用于解析XML / HTML的Swift libxml2包装器。 功能构建XML / HTML树并导航XPath查询支持的全面单元测试覆盖...

    GDataXML-HTML:适用于iOS和OSXHTML和XML解析器,支持XPath

    GDataXML-HTML是基于Google的GDataXML的iOS和OSXHTML / XML解析器。 顾名思义,它增加了对libxml2HTMLparser模块的支持,并使您能够处理未验证的XML或HTML。 因此,您可以使用例如XPath来解析具有合理性能的网站 ...

    小野:针对iOS和macOS处理XML和HTML的明智方法

    由libxml2提供支持的性能libxml2文档解析和遍历 同时支持和查询 自动转换日期和数字值 正确,常识性地处理元素和属性的XML名称空间 能够从NSString或NSData加载HTML和XML文档 完整文件 综合测试套件 安装 ...

    Simple-KML:Simple KML是用于iOS平台的用Objective-C编写的KML的简单轻量级解析库

    简单的KML:Keyhole标记语言的可可解析库简单KML是用Objective-C为iOS平台编写的KML的简单轻量级解析库。 它不是为了绘图,而是为了解析。... 简单的KML依赖于 (一种基于libxml2用于基于DOM的XML解析的

    Axt:适用于iOS的宽容HTML SAX解析器

    轴心受NSXMLParser启发的iOS版HTML SAX解析器。 Axt是斧头)的德语单词。 Axt受到NSXMLParser极大启发,它非常适合解析XML,但不适用于HTML。 HTML通常格式不正确,这使其不适用于NSXMLParser 。 在这种情况下, ...

    Ji:Ji(戟)是Swift的XMLHTML解析器

    吉戟 Ji(戟)是libxml2上的Swift包装器,用于解析XML / HTML。特征 构建XML / HTML树并导航。 XPath查询支持。 全面的单元测试范围。 支持Swift Package Manager(SPM)。 与Linux兼容。要求iOS 8.0 + / Mac OS X ...

    libxml教程(图文详解)

    缘起我的CloudBox需要一个跨平台的方案来解决iOS上以及Android上的xml档案读取问题因为游戏总是需要储存一些设定值,或是过关存档之类的但又不能轻易的使用iOS内建提供的或著是Java内建提供的函数,这样整起来会很...

    GDataXMLNode文件

    xml 的 DOM 解析 使用GDataXmlNode 这个类库 来实现 直接导入类库 会报错 报错的原因 : GDataXmlNode 基于libxml 来写的 必须把libxml 导入

    RSParser:RSS,Atom,JSON Feed,RSS-inJSON,OPML和HTML的解析器

    它还包括用于libXML2的XML SAX和HTML SAX解析器的Objective-C包装器。 您可以在这些之上编写自己的解析器。 该框架是为macOS构建的。 也可以为iOS构建它,但是我还没有解决。 如何解析提要 要获取Feed的类型(即使...

    支持解析html网页的数据功能

    用的时候对于谷歌的类要添加libxml2.2.dylib和在 build setting&gt;header search paths添加/usr/include/libxml2 对于svp,我们要添加QuartzCore.framework这个库。如果使用ARC,请在pases声明这个类不用ARC -fobjc...

Global site tag (gtag.js) - Google Analytics