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、读xml的reader的释放与清理
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>
相关推荐
GDataXML库(又称libxml2)是一个Objective-C封装的XML解析库,它提供了一种更面向对象的方式来解析XML。与NSXMLParser不同,GDataXML支持XPath查询,允许开发者更方便地定位和提取XML文档中的特定节点。例如,可以...
GDataXML基于libxml2库,这是一个强大的、广泛使用的XML解析库。相比NSXMLParser,GDataXML的优势在于其更友好的API,使得XML解析变得更加简单,提高了开发效率。 GDataXML的主要特性包括: 1. **易于使用**:...
而GDataXMLNode库(基于libxml2)提供了一个更面向对象的方法,对于小型XML文件,它的使用更为方便,且易于理解和操作。 **NSXMLParser使用方法:** 1. 创建NSXMLParser实例,传入XML数据的NSData对象。 2. 实现...
在iOS中,XML解析通常有以下几种方式:NSXMLParser、GDataXML、XMLReader以及libxml2库。其中,XMLReader因其性能和内存管理的优势,成为处理大量XML数据的理想选择。 首先,我们需要了解XML的基本结构。XML文档由...
libxml是一个功能强大的C语言库,提供了XML解析、DOM操作和XPath等功能,适用于需要高效、低级操作的场景。 在这个通用类中,核心是使用libxml的SAX(Simple API for XML)解析器。SAX解析器是事件驱动的,它在解析...
GDataXML库基于libxml2,这是一个强大的XML解析库,被广泛用于各种平台。GDataXMLNode是这个库的核心类,它代表了XML文档中的任意节点,可以是元素、文本、注释等。GDataXMLNode.h和GDataXMLNode.m分别是该类的...
在iOS开发中,了解和掌握XML解析是非常重要的技能。除了上述两种方法,还有其他的解析库如XMLDictionary,它提供了更简洁的API,以字典形式返回解析结果。不过,对于学习基础和理解不同解析方式的优缺点,这个...
- 导航至`/usr/lib`,找到`libxml2.tbd`(在旧版本的Xcode中可能是`libxml2.dylib`)并添加。 - 添加完成后,确保在`Header Search Paths`中添加`$(SDKROOT)/usr/include/libxml2`,以便编译器能找到libxml的相关...
另一种是使用libxml2库,这是一个强大的XML解析库,支持DOM(Document Object Model)和SAX(Simple API for XML)两种解析方式。DOM解析将整个XML文档加载到内存中形成一棵树形结构,方便查找和操作;SAX解析则按需...
2. **LibXML2库**:这是一个开源的XML解析库,iOS SDK包含了这个库的封装。开发者可以使用GXMLElement或XMLDocument类来解析XML。LibXML2支持SAX(Simple API for XML)和DOM(Document Object Model)两种解析模式...
GDataXML(也称为libxml2)是另一个流行的XML解析库,它提供了更简洁的API来处理XML。与NSXMLParser不同,GDataXML支持XPath查询,允许开发者通过表达式直接定位到XML文档中的特定节点。以下是如何使用GDataXML解析...
2、IOS中XML解析方案有很多种: 2-1、第三方框架: libxml2:纯C语言,默认包含在iOS SDK中,同时支持DOM和SAX解析 GDataXML:DOM方式解析,由Google开发,基于libxml2 2-2、苹果原生 NSXMLParser:SAX...
而libxml2则是一个强大的XML解析库,提供了更底层的接口,可以处理大型XML文件,且效率更高。 1. 使用NSXMLParser解析XML: NSXMLParser是一个Objective-C类,它会在解析过程中触发一系列的代理方法。你需要实现...
- 第二种方式是使用第三方库,如`libxml2`,它提供了完整的DOM解析API,可以创建和操作XML文档的完整树形结构。 ### JSON解析 在iOS中,处理JSON数据主要有以下几种方式: 1. **系统解析**: iOS自iOS5开始引入...
本教程将深入探讨如何在iOS应用中轻松解决XML解析问题。 首先,我们要了解iOS中两种主要的XML解析库:NSXMLParser和XMLParser。NSXMLParser是苹果提供的基于事件驱动的解析器,适合处理小到中等规模的XML文档。它...
- 虽然 XMLDictionary 提供了便捷的 API,但在处理大量或复杂的 XML 文档时,可能不如专业的 XML 解析库如 libxml2 快。因此,对于性能敏感的应用,可能需要权衡便利性和性能。 8. **与其他数据格式的转换**: - ...
2. **libxml2库**:这是一套强大的XML解析库,也被Apple集成到iOS SDK中。它提供了两种解析模式:SAX(Simple API for XML)和DOM(Document Object Model)。SAX类似于NSXMLParser,是事件驱动的;而DOM则将整个XML...
iOS提供了两种主要的XML解析方式:NSXMLParser和XML.framework(包括libxml2库)。NSXMLParser是基于事件的解析器,它在解析过程中触发一系列的事件回调,如元素开始、结束、遇到属性等。而XML.framework则提供了更...
4. **libxml2**:这是一个强大的XML和HTML解析库,可以直接在iOS中使用。Swift可以通过C语言接口来调用libxml2的函数,比如`xmlReaderForDoc()`和`xmlTextReaderRead()`等。 5. **SwiftSoup**:这是Swift的一个HTML...