• IOS成长之路-用NSXMLParser实现XML解析


    再次对xml进行解析,又有了些理解,如果有不对的地方,请给小弟指出,谢谢!

    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <result>  
    3.     <meeting addr="203">  
    4.         <creator>张一</creator>  
    5.         <member>  
    6.             <name>张二</name>  
    7.             <age>20</age>  
    8.         </member>  
    9.         <member>  
    10.             <name>张三</name>  
    11.             <age>21</age>  
    12.         </member>  
    13.         <member>  
    14.             <name>张四</name>  
    15.             <age>22</age>  
    16.         </member>  
    17.     </meeting>  
    18.       
    19.     <meeting addr="204">  
    20.         <creator>李一</creator>  
    21.         <member>  
    22.             <name>李二</name>  
    23.             <age>20</age>  
    24.         </member>  
    25.         <member>  
    26.             <name>李三</name>  
    27.             <age>21</age>  
    28.         </member>  
    29.         <member>  
    30.             <name>李四</name>  
    31.             <age>22</age>  
    32.         </member>  
    33.     </meeting>  
    34. </result>  


    1.获取xml文件中的数据:存放到字符串中

    1. //bundle是一个目录,包含了程序会使用到的资源  
    2.     NSString *path=[[NSBundle mainBundle] pathForResource:@"test" ofType:@"xml"];  
    3.     NSString *_xmlContent=[[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];  


    用NSXMLParser实现解析:

    1. NSXMLParser解析简要说明  
    2.          1.是sax方法解析  
    3.          2.需要创建NSXMLParser实例 (alloc)  
    4.                并创建解析器 (initWithData:)  
    5.                   为解析器定义委托 (setDelegate:)  
    6.                       运行解析器 (parser)  
    7.          ++++++当parser初始化并执行parse语句时([parser parse]),程序会跳到代理方法里面走第一个代理方法++++++  
    8.          3.这种解析方式是利用它的代理NSXMLParserDelegate实现的  
    9.          第一个代理方法:开始处理xml数据,它会把整个xml遍历一遍,识别元素节点名称  
    10.          - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict;  
    11.          第二个代理方法:也就是得到文本节点里存储的信息数据  
    12.          - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string;  
    13.          第三个代理方法:存储从第二个代理方法中获取到的信息  
    14.          - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName  
    15.          这就是解析的过程,在这个过程中会不停的重复的执行这三个代理方法,直到遍历完成  
    16.            
    17.          另外:  
    18.              解析开始执行的方法  
    19.          - (void)parserDidStartDocument:(NSXMLParser *)parser;  
    20.              解析结束执行的方法  
    21.          - (void)parserDidEndDocument:(NSXMLParser *)parser;  
    22.              当出现解析错误的时候,会执行这个方法  
    23.          - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError;  


    解析开始:

    2.准备工作:

    1. NSXMLParser *parse=[[NSXMLParser alloc] initWithData:[_xmlContent dataUsingEncoding:NSUTF8StringEncoding]];  
    2.         [parse setDelegate:self];  
    3.         [parse parse];  
    4.         [parse release];  


    3.三个代理方法具体实现:

    1. //第一个代理方法:  
    2. - (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict   
    3. {  
    4.     //判断是否是meeting  
    5.     if ([elementName isEqualToString:@"meeting"]) {  
    6.         //判断属性节点  
    7.         if ([attributeDict objectForKey:@"addr"]) {  
    8.             //获取属性节点中的值  
    9.             NSString *addr=[attributeDict objectForKey:@"addr"];  
    10.         }  
    11.     }  
    12.     //判断member  
    13.     if ([elementName isEqualToString:@"member"]) {  
    14.         NSLog(@"member"]);  
    15.     }  
    16. }  
    17.   
    18. //第二个代理方法:  
    19. - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string   
    20. {  
    21.     //获取文本节点中的数据,因为下面的方法要保存这里获取的数据,所以要定义一个全局变量(可修改的字符串)  
    22.     //NSMutableString *element = [[NSMutableString alloc]init];  
    23.     //这里要赋值为空,目的是为了清空上一次的赋值  
    24.     [element setString:@""];  
    25.     [element appendString:string];//string是获取到的文本节点的值,只要是文本节点都会获取(包括换行),然后到下个方法中进行判断区分  
    26. }  
    27.   
    28. //第三个代理方法:  
    29. - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName  
    30. namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {  
    31.       
    32.     NSString *str=[[NSString alloc] initWithString:element];  
    33.       
    34.     if ([elementName isEqualToString:@"creator"]) {  
    35.         NSLog(@"creator=%@",str);  
    36.     }  
    37.     if ([elementName isEqualToString:@"name"]) {  
    38.         NSLog(@"name=%@",str);  
    39.     }  
    40.     if ([elementName isEqualToString:@"age"]) {  
    41.         NSLog(@"age=%@",str);  
    42.     }  
    43.     [str release];  
    44. }  


    注意:

    解析xml数据的时候,

                     每当遇到元素节点的时候都会执行第一个代理方法,如果有属性节点,可以直接在这个方法中获取里面的值;

                     每当遇到文本节点的时候都会执行第二个代理方法,获取文本节点中的值然后到第三个方法中进行区分。

                              如果是换行符的话也会获取,因为换行符也是文本节点,不过当一个元素节点结束后的换行符是不会获取的。

       比如说:      (换行符1)

                                                      <li>文本节点</li>

                                                      (换行符2)

                  元素节点前后各有一个换行符,这时只会获取换行符1,而不会获取换行符2。

    4.处理错误:打印错误

      1. - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError{  
      2.     NSLog(@"%@",[parseError description]);  
  • 相关阅读:
    将表中数据生成SQL语句
    遍历页面所有的控件
    MSN不能登陆
    刷新框架页
    JS传参出现乱码
    iframe攻击
    有关于VS调试Javascript的问题
    C#中StringBuilder类的使用
    前瞻XAML
    Asp.Net在SqlServer中的图片存取
  • 原文地址:https://www.cnblogs.com/ejllen/p/4308908.html
Copyright © 2020-2023  润新知