zoukankan      html  css  js  c++  java
  • IOS 解析XML--使用NSXML

     一、解析文档顺序触发的函数

    1.parserDidStartDocument,在文档的时候触发。

    2.parser:didStartElement:namespaceURI:qualifiedName:attributes,遇到一个开始标签时触发,其中namespaceURI部分是命名空间,qualifiedName是限定名,attributes是字典类型的属性集合。

    3.parser:foundCharacters,遇到字符串是触发。

    4.parser:didEndElement:namespaceURI:qualifiedName,遇到结束标签时触发。

    5.parserDidEndDocument,遇到文档结束时触发。

    二、NSXMLParser是解析类,它有3个构造方法

    1.initWithContentsOfURL,可以使用URL对象创建解析对象,本例中采用的是该方法,先从资源文件中加载获得URL对象,再使用URL对象构建解析对象。

    2.initWithData,可以使用NSData创建解析对象。

    3.initWithStream,可以使用IO流对象创建解析对象。

    解析对象创建好后需要指定委托属性对象delegate为self,然后发送parse消息,开始解析文档。

    三、代码

    NotesXMLParser.h

    #import <Foundation/Foundation.h>
    
    @interface NotesXMLParser : NSObject <NSXMLParserDelegate>
    
    //解析出的数据内部是字典类型
    @property (strong,nonatomic) NSMutableArray *notes;
    //当前标签的名字
    @property (strong,nonatomic) NSString *currentTagName;
    
    //开始解析
    -(void)start;
    
    @end

    NotesXMLParser.m

    #import "NotesXMLParser.h"
    
    @implementation NotesXMLParser
    
    
    -(void)start
    {
        NSString* path = [[NSBundle mainBundle] pathForResource:@"Notes" ofType:@"xml"];
        
        NSURL *url = [NSURL fileURLWithPath:path];
        //开始解析XML
        NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
        parser.delegate = self;
        [parser parse];
        NSLog(@"解析完成...");
    }
    
    //文档开始的时候触发
    - (void)parserDidStartDocument:(NSXMLParser *)parser
    {
        _notes = [NSMutableArray new];
    }
    
    //文档出错的时候触发
    - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
    {
        NSLog(@"%@",parseError);
    }
    
    //遇到一个开始标签时候触发
    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
      namespaceURI:(NSString *)namespaceURI
     qualifiedName:(NSString *)qualifiedName
        attributes:(NSDictionary *)attributeDict
    {
        _currentTagName = elementName;
        if ([_currentTagName isEqualToString:@"Note"]) {
            NSString *_id = [attributeDict objectForKey:@"id"];
            NSMutableDictionary *dict = [NSMutableDictionary new];
            [dict setObject:_id forKey:@"id"];
            [_notes addObject:dict];
        }
        
    }
    
    //遇到字符串时候触发
    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
    {
        //替换回车符和空格
        string =[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
        if ([string isEqualToString:@""]) {
            return;
        }
        NSMutableDictionary *dict = [_notes lastObject];
        
        if ([_currentTagName isEqualToString:@"CDate"] && dict) {
            [dict setObject:string forKey:@"CDate"];
        }
        
        if ([_currentTagName isEqualToString:@"Content"] && dict) {
            [dict setObject:string forKey:@"Content"];
        }
        
        if ([_currentTagName isEqualToString:@"UserID"] && dict) {
            [dict setObject:string forKey:@"UserID"];
        }
    }
    
    //遇到结束标签时候出发
    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
      namespaceURI:(NSString *)namespaceURI
     qualifiedName:(NSString *)qName;
    {
        self.currentTagName = nil;
    }
    
    
    //遇到文档结束时候触发
    - (void)parserDidEndDocument:(NSXMLParser *)parser
    {
        [[NSNotificationCenter defaultCenter] postNotificationName:@"reloadViewNotification" object:self.notes userInfo:nil];
        self.notes = nil;
    }
    
    @end
     
     
  • 相关阅读:
    Visual Studio自带的的Developer Command Prompt对话框
    利用VS(Visual Studio)自带的工具查看DLL文件的信息
    谷歌面试官反馈级别
    Inno Setup中多语言时,使用占位符填充
    SQL*Plus命令
    Oracle 所有字典
    彻底完全卸载 SQL Server 2005 的图文教程
    win7(windows 7)系统下安装SQL2005(SQL Server 2005)图文教程
    创建表空间、新增用户、给用户赋予DBA权限 、删除用户下的上有数据表
    ORA-01012: not logged on
  • 原文地址:https://www.cnblogs.com/zhongxuan/p/4857517.html
Copyright © 2011-2022 走看看