zoukankan      html  css  js  c++  java
  • iOS学习笔记(九)——xml数据解析

        在iPhone开发中,XML的解析有很多选择,iOS SDK提供了NSXMLParser和libxml2两个类库,另外还有很多第三方类库可选,例如TBXML、TouchXML、KissXML、TinyXML和GDataXML。这篇文章使用了NSXMLParser。

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

    • DOM解析XML时,读入整个XML文档并构建一个驻留内存的树结构(节点树),通过遍历树结构可以检索任意XML节点,读取它的属性和值。而且通常情况下,可以借助XPath,直接查询XML节点。
    • SAX解析XML,是基于事件通知的模式,一边读取XML文档一边处理,不必等整个文档加载完之后才采取操作,当在读取解析过程中遇到需要处理的对象,会发出通知对其进行处理。

        NSXMLParser是基于SAX的解析方式。NSXMLParser采用了委托设计模式,因此他的实现类需要采用协议并支持委托。NSXMLParser解析XML需要委托NSXMLParserDelegate实现。

    1、初始化NSXMLParser

    要使用NSXMLParser要先创建它,设置各种属性,主要用到以下几个方法:

    initWithContentsOfURL  通过NSURL创建解析器

    initWithData                 通过NSData创建解析器

    setDelegate                  为解析器定义委托

    parse                           运行解析器

       NSXMLParser *parser=[[NSXMLParser alloc] initWithData:[xml dataUsingEncoding:NSUTF8StringEncoding]];
        
    //    NSXMLParser *parser=[[NSXMLParser alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://earthquake.usgs.gov/earthquakes/catalogs/7day-M2.5.xml"]];
        
        [parser setDelegate:self];//设置NSXMLParser对象的解析方法代理
        [parser setShouldProcessNamespaces:NO];
        [parser parse];//开始解析
    


    2、委托方法

    主要使用一下委托方法:

    //发现元素开始符的处理函数  (即报告元素的开始以及元素的属性) 
    - (void)parser:(NSXMLParser *)parser 
            didStartElement:(NSString *)elementName 
            namespaceURI:(NSString *)namespaceURI 
            qualifiedName:(NSString *)qName 
            attributes:(NSDictionary *)attributeDict
    
    //处理标签包含内容字符 (报告元素的所有或部分内容) 
    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
    
    //发现元素结束符的处理函数,保存元素各项目数据(即报告元素的结束标记)
    - (void)parser:(NSXMLParser *)parser 
            didEndElement:(NSString *)elementName 
            namespaceURI:(NSString *)namespaceURI 
            qualifiedName:(NSString *)qName
    
    //报告解析的结束 
    - (void)parserDidEndDocument:(NSXMLParser *)parser
    
    //报告不可恢复的解析错误
    - (void)paser:parserErrorOccured

     

    执行[parser parse]后会依序执行:

    1、didStartElement

    2、foundCharacters

    3、didEndElement

    示例如下:

    -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
        
        NSLog(@"xml_parser start %@ ",elementName);
        if ( [elementName isEqualToString:@"person"] ) {
            NSLog(@"xml_parser person ");
            if(personNameArrary==nil){
                personNameArrary=[[NSMutableArray alloc] init];
            }
        }
    
            if(itemValue!=nil){
                itemValue=nil;
            }
            itemValue=[[NSMutableString alloc] init];
        
        if ( [elementName isEqualToString:@"phone"] ) {  
            NSString *atr=[attributeDict valueForKey:@"type"];
            NSLog(@"xml_parser phone type: %@",atr);
        }
    }
    
    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
        
        NSLog(@"xml_parser value:%@",string);
        [itemValue appendString:string];
    }
    
    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    
        NSLog(@"xml_parser end %@ ",elementName);
        if ( [elementName isEqualToString:@"firstName"] ) {
            [personNameArrary addObject:itemValue];
        }
        
        if ( [elementName isEqualToString:@"person"] ) {
            NSLog(@"xml_parser person end");
        }
        
    }
    


    NSXMLParser DEMO 下载

    /**
    * @author 张兴业
    *  iOS入门群:83702688
    *  android开发进阶群:241395671
    *  我的新浪微博:@张兴业TBOW
    */
     
    参考:
     

    http://www.cnblogs.com/dotey/archive/2011/05/11/2042000.html

    https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/XMLParsing/Articles/HandlingElements.html#//apple_ref/doc/uid/20002265-BCIJFGJI

    http://www.raywenderlich.com/553/how-to-chose-the-best-xml-parser-for-your-iphone-project#

  • 相关阅读:
    ACM解题之快速输出杨辉三角形(前68行)
    ACM解题之素矩阵
    ACM解题之回文序列
    python批量修改文件名
    HTML页面导航栏页脚不动,变换中间部分
    VS2013正则表达式应用示例
    <<数学传奇>>概述
    C#在不同平台下DLL的引用问题
    在C++中实现类似Java的“synchronized”
    VS编译完成后自动复制到远程机器
  • 原文地址:https://www.cnblogs.com/xyzlmn/p/3168051.html
Copyright © 2011-2022 走看看