XML 解析

2018-11-11  本文已影响0人  和风细羽

XML文件

一、简介

1、XML 优点
①、格式统一,符合标准
②、容易与其他系统进行远程交互,数据共享比较方便

2、XML 缺点
①、XML 文件庞大,文件格式复杂,传输占带宽
②、服务器端和客户端都需要花费大量代码来解析 XML,导致服务器端和客户端代码变得异常复杂且不易维护
③、客户端不同浏览器之间解析 XML 的方式不一致,需要重复编写很多代码
④、服务器端和客户端解析 XML 花费较多的资源和时间

3、解析方式

通常有 DOM 和 SAX 两种解析 XML 方式:

二、解析库

1、NSXMLParser

使用 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

解析速率 内存占用

4. 学习文章

《How To Choose The Best XML Parser for Your iPhone Project》
宝玉 # iOS平台XML解析类库对比和安装说明
PhelanGeek # iOS下XML文件的三种解析方式

上一篇 下一篇

猜你喜欢

热点阅读