一、简介
1、XML 优点
①、格式统一,符合标准
②、容易与其他系统进行远程交互,数据共享比较方便
2、XML 缺点
①、XML 文件庞大,文件格式复杂,传输占带宽
②、服务器端和客户端都需要花费大量代码来解析 XML,导致服务器端和客户端代码变得异常复杂且不易维护
③、客户端不同浏览器之间解析 XML 的方式不一致,需要重复编写很多代码
④、服务器端和客户端解析 XML 花费较多的资源和时间
3、解析方式
通常有 DOM 和 SAX 两种解析 XML 方式:
-
DOM 解析 XML 时,读入整个 XML 文档并构建一个驻留内存的树结构(节点树),通过遍历树结构可以检索任意 XML 节点,读取它的属性和值。而且通常情况下,可以借助 XPath,直接查询 XML 节点。
-
SAX 解析 XML,是基于事件通知的模式,一边读取 XML 文档一边处理,不必等整个文档加载完之后才采取操作,当在读取解析过程中遇到需要处理的对象,会发出通知对其进行处理。
二、解析库
使用 SAX 方式解析 XML 的类库,默认包含在 iOS SDK 中。
#pragma mark - SAX解析
/// SAX 逐行解析
{
NSXMLParser * xmlParser = [[NSXMLParser alloc] initWithData:xmlData];
xmlParser.delegate = self;
// 开始解析
[xmlParser parse];
}
# pragma mark - Delegate
/// 开始解析
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
}
/// 获取开始节点
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict
{
NSLog(@"开始节点:%@", elementName);
}
// 获取节点的值 (这个方法在 didStartElement: 和 didEndElement: 后会分别调用一次)
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
NSLog(@"节点的值:%@", string);
}
/// 获取结束节点
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
NSLog(@"结束节点:%@", elementName);
}
/// 解析结束
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
NSLog(@"结束");
}
2、libxml2
默认包含在 iOS SDK 中的开源类库,它是基于 C 语言的 API,所以使用起来可能不如 NSXMLParser 方便。
它同时支持 DOM 和 SAX 解析。libxml2 的 SAX 解析方式还是非常酷的,因为它可以边读取边解析,尤其是在从网上下载一个很大的 XML 文件时,可以一边下载一边对已经下载好的内容进行解析,极大的提高解析效率。
3、TBXML
①、轻量级的 DOM 方式的 XML 解析类库
②、有很好的性能和低内存占用,
③、不对 XML 格式进行校验
④、不支持 XPath
⑤、并且只支持解析,不支持对 XML 进行修改。
4、TouchXML
①、DOM 方式的 XML 解析类库;
②、支持 XPath;
③、不支持 XML 的修改。
5、KissXML
①、基于 TouchXML 的 XML 解析类库
②、支持 XML 的修改。
6、TinyXML
①、基于 C 语言的 DOM 方式解析的类库;
②、支持对 XML 的读取和修改;
③、不直接支持 XPath,需要借助另一个相关的类库 TinyXPath 才可以支持 XPath。
7、GDataXML
①、Google 开发的 DOM 方式解析类库
②、支持读取和修改 XML 文档
③、支持 XPath 方式查询。
/* 1、添加 libxml2.tbd
2、Header Search Paths 设置 /usr/include/libxml2
3、GDataXMLNode.m 设置 -fno-objc-arc
*/
{
GDataXMLDocument * xmlDocument = [[GDataXMLDocument alloc] initWithData:xmlData options:0 error:&error];
// 获取根节点
GDataXMLElement * rootElement = [xmlDocument rootElement];
// 获取根节点下的所有子节点
NSArray * elementArray = rootElement.children;
for (GDataXMLElement * element in elementArray) {
}
8、XMLReader
①、基于 NSXMLParser 的 SAX 方式解析类库
3. 选择类库
NSXML | libxml2(SAX) | TBXML | TouchXML | KissXML | TinyXML | GDataXML | libxml2(DOM) | |
---|---|---|---|---|---|---|---|---|
SDK? | Yes | Yes | No | No | No | No | No | Yes |
解析时间 | 1.87 | 1.19 | 0.68 | 1.1 | 1.37 | 1.27 | 1.07 | 0.84 |
内存占用 | 3.11 | 3.01 | 3.07 | 6.5 | 5.25 | 4.8 | 4.15 | 4.97 |
边下载边解析 | No | Yes | No | No | No | No | No | No |
编辑 | No | No | No | No | Yes | Yes | Yes | Yes |
XPath | No | No | No | Yes | Yes | Yes* | Yes | Yes |
语言 | Obj-C | C | Obj-C | Obj-C | Obj-C | C | Obj-C | C |
License | Apple | MIT | MIT | MIT | MIT | ZLib | Apache | MIT |
* = with TinyXPath
- 如果是读取很小的XML文档,性能基本上没有什么差别,不过从调用的方便性来说,建议使用TouchXML、KissXML或GDataXML
- 如果是需要读取和修改 XML 文档,建议使用 KissXML 或 GDataXML
- 如果需要读取非常大的 XML 文档,则建议使用 libxml2 或 TBXML
- 如果你不想去调用第三方类库,那么可以使用 NSXMLParser。
4. 学习文章
《How To Choose The Best XML Parser for Your iPhone Project》
宝玉 # iOS平台XML解析类库对比和安装说明
PhelanGeek # iOS下XML文件的三种解析方式
网友评论