美文网首页
XML 解析

XML 解析

作者: 和风细羽 | 来源:发表于2018-11-11 00:42 被阅读0次

    XML文件

    一、简介

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

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

    3、解析方式

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

    • DOM 解析 XML 时,读入整个 XML 文档并构建一个驻留内存的树结构(节点树),通过遍历树结构可以检索任意 XML 节点,读取它的属性和值。而且通常情况下,可以借助 XPath,直接查询 XML 节点。

    • SAX 解析 XML,是基于事件通知的模式,一边读取 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

    • 如果是读取很小的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文件的三种解析方式

    相关文章

      网友评论

          本文标题:XML 解析

          本文链接:https://www.haomeiwen.com/subject/emitfqtx.html