您的位置:首页 > 移动开发 > IOS开发

ios-使用NSXMLParser解析XML文件

2014-08-30 11:33 337 查看
NSXML是ios SDK自带的,也是苹果默认的解析框架,它采用SAX模式解析,是SAX解析模式的代表。NSXML框架的核心是NSXMLParser和它的委托协议NSXMLParserDelegate。

1、例子Notes.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Notes>
    <Note id="1">
        <CDate>2012-12-21</CDate>
        <Content>iosBOOK_1</Content>
        <UserID>tony</UserID>
    </Note>
    <Note id="2">
        <CDate>2012-12-22</CDate>
        <Content>iosBOOK_2</Content>
        <UserID>tony</UserID>
    </Note>
    <Note id="3">
        <CDate>2012-12-23</CDate>
        <Content>iosBOOK_3</Content>
        <UserID>tony</UserID>
    </Note>
    <Note id="4">
        <CDate>2012-12-24</CDate>
        <Content>iosBOOK_4</Content>
        <UserID>tony</UserID>
    </Note>
    <Note id="5">
        <CDate>2012-12-25</CDate>
        <Content>iosBOOK_5</Content>
        <UserID>tony</UserID>
    </Note>
    <Note id="6">
        <CDate>2012-12-26</CDate>
        <Content>iosBOOK_6</Content>
        <UserID>tony</UserID>
    </Note>
</Notes>


2、编写一个专门解析XML文件的类(NotesXMLParser):

- (void)start
{
    // 在整个程序包里面搜索Notes.xml
    NSString *path = [[NSBundle mainBundle] pathForResource:@"Notes" ofType:@"xml"];
    NSURL *url = [NSURL fileURLWithPath:path];
    
    NSXMLParser *m_Parser = [[[NSXMLParser alloc] initWithContentsOfURL:url] autorelease];
    m_Parser.delegate = self;
    [m_Parser parse];
}

// 解析文档开始
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
    _notes = [[NSMutableArray alloc] init];
}

// 解析文档结束
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
    // 使用KVO模式,通知中心机制
    [[NSNotificationCenter defaultCenter] postNotificationName:@"reloadXMLData" object:_notes userInfo:nil];
    
    [_notes removeAllObjects];
    _notes = nil;
}

// 解析开始标签
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    _curTagName = elementName;
    if ([_curTagName isEqualToString:@"Note"])
    {
        NSString *_id = [attributeDict objectForKey:@"id"];
        NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
        [dict setObject:_id forKey:@"id"];
        [_notes addObject:dict];
        [dict release];
    }
}

// 解析结束标签
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    _curTagName = nil;
}

// 解析字符串
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    string = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    if ([string isEqualToString:@""])
        return;
    
    NSMutableDictionary *dict = [_notes lastObject];
    if ([_curTagName isEqualToString:@"CDate" ] && dict)
    {
        [dict setObject:string forKey:@"CDate"];
    }
    else if ([_curTagName isEqualToString:@"Content"] && dict)
    {
        [dict setObject:string forKey:@"Content"];
    }
    else if ([_curTagName isEqualToString:@"UserID"])
    {
        [dict setObject:string forKey:@"UserID"];
    }
}

#if M_COMPILE == DEBUG
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
{
    NSLog(@"解析错误:%@",parseError);
}
#endif


3、实际使用:

<pre name="code" class="cpp">- (void)initObserver
{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getXMLData:) name:@"reloadXMLData" object:nil];
    
    // 开始解析xml文件
    NotesXMLParser *parser = [[NotesXMLParser alloc] init];
    [parser start];
    [parser release];
}

- (void)getXMLData:(NSNotification *)notification
{
    NSMutableArray *xmlData = [notification object];
    NSLog(@"xmlData:%@",xmlData);
}



至此,NSXMLParser的介绍已经完毕,效果如下:
2014-08-30 11:14:27.671 test71[6436:60b] xmlData:(
        {
        CDate = "2012-12-21";
        Content = "iosBOOK_1";
        UserID = tony;
        id = 1;
    },
        {
        CDate = "2012-12-22";
        Content = "iosBOOK_2";
        UserID = tony;
        id = 2;
    },
        {
        CDate = "2012-12-23";
        Content = "iosBOOK_3";
        UserID = tony;
        id = 3;
    },
        {
        CDate = "2012-12-24";
        Content = "iosBOOK_4";
        UserID = tony;
        id = 4;
    },
        {
        CDate = "2012-12-25";
        Content = "iosBOOK_5";
        UserID = tony;
        id = 5;
    },
        {
        CDate = "2012-12-26";
        Content = "iosBOOK_6";
        UserID = tony;
        id = 6;
    }
)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: