11.12. Parsing XML with NSXMLParser

本文档介绍了如何使用Objective-C中的NSXMLParser类解析XML数据。通过创建XMLElement类来存储解析结果,并实现NSXMLParserDelegate协议的方法,详细展示了从开始解析到结束的整个过程,包括元素开始、字符找到、元素结束等关键步骤。
摘要由CSDN通过智能技术生成

Step1:自己写个XMLElement类

.h文件

#import <Foundation/Foundation.h>


@interface XMLElement : NSObject


@property (nonatomic, copy) NSString *name;

@property (nonatomic, copy) NSString *text;

@property (nonatomic, copy) NSDictionary *attributes;

@property (nonatomic, strong) NSMutableArray *subElements;

@property (nonatomic, weak) XMLElement *parent;


@end


.m文件

#import "XMLElement.h"


@implementation XMLElement


- (NSMutableArray *) subElements{

    if (_subElements == nil){

        _subElements = [[NSMutableArray alloc] init];

    }

    return _subElements;

}


-(NSString*)description

{

    NSMutableString * desc = [NSMutableString stringWithFormat:@"<%@",self.name];

    

    [self.attributes enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {

        [desc appendFormat:@" %@=%@",key,obj];

    }];

    

    [desc appendString:@">"];

    if (self.text) {

        [desc appendFormat:@"%@",self.text];

    }

    

    [_subElements enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

        [desc appendFormat:@"%@",obj];

    }];

    

    [desc appendFormat:@"</%@>",self.name];

    

    return desc;

        

}


@end



step2:声明解析类,实现代理


#import "XMLElement.h"


@interface ViewController ()<NSXMLParserDelegate>


@property (nonatomic, strong) NSXMLParser *xmlParser;

@property (nonatomic, strong) XMLElement *rootElement;

@property (nonatomic, strong) XMLElement *currentElementPointer;


@end


step3:解析过程


- (IBAction)buttonAction:(id)sender {

    NSString * xmlStr = @"<?xml version=\"1.0\" encoding=\"UTF-8\"?><root><person id=\"1\"> <firstName>Anthony</firstName> <lastName>Robbins</lastName> <age>51</age></person><person id=\"2\"> <firstName>Richard</firstName> <lastName>Branson</lastName> <age>61</age></person></root>";

    

    NSData * xmlData = [xmlStr dataUsingEncoding:NSUTF8StringEncoding];

    NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:xmlData];

    xmlParser.delegate = self;

    if ([xmlParser parse]) {

        NSLog(@"The XML is parsed.rootElement=%@",self.rootElement);

    } else{

        NSLog(@"Failed to parse the XML");

    }


}


- (void)parserDidStartDocument:(NSXMLParser *)parser{

    self.rootElement = nil;

    self.currentElementPointer = nil;

}


- (void) parser:(NSXMLParser *)parser

didStartElement:(NSString *)elementName

   namespaceURI:(NSString *)namespaceURI

  qualifiedName:(NSString *)qName

     attributes:(NSDictionary *)attributeDict{

    NSLog(@"%s",__FUNCTION__);

    NSLog(@"elementName=%@ namespaceURI=%@ qName=%@ attributeDict=%@",elementName,namespaceURI,qName,attributeDict);

    if (self.rootElement == nil){

        /* We don't have a root element. Create it and point to it */

        self.rootElement = [[XMLElement alloc] init];

        self.currentElementPointer = self.rootElement;

    } else {

        /* Already have root. Create new element and add it as one of

         the subelements of the current element */

        XMLElement *newElement = [[XMLElement alloc] init];

        newElement.parent = self.currentElementPointer;

        [self.currentElementPointer.subElements addObject:newElement];

        self.currentElementPointer = newElement;

    }

    self.currentElementPointer.name = elementName;

    self.currentElementPointer.attributes = attributeDict;

}


- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{

    

    NSLog(@"%s",__FUNCTION__);

    NSLog(@"%@",string);

    

    if ([self.currentElementPointer.text length] > 0){

        self.currentElementPointer.text = [self.currentElementPointer.text stringByAppendingString:string];

    } else {

        self.currentElementPointer.text = string;

    }

}


- (void) parser:(NSXMLParser *)parser

  didEndElement:(NSString *)elementName

   namespaceURI:(NSString *)namespaceURI

  qualifiedName:(NSString *)qName{

    

    NSLog(@"%s",__FUNCTION__);

    NSLog(@"elementName=%@ namespaceURI=%@ qName=%@",elementName,namespaceURI,qName);


    self.currentElementPointer = self.currentElementPointer.parent;

}


- (void)parserDidEndDocument:(NSXMLParser *)parser{

    self.currentElementPointer = nil;

}


打印:

2014-06-27 09:29:40.078 cookbook7[349:a0b] -[ViewController parser:didStartElement:namespaceURI:qualifiedName:attributes:]

2014-06-27 09:29:40.079 cookbook7[349:a0b] elementName=root namespaceURI=(null) qName=(null) attributeDict={

}

2014-06-27 09:29:40.080 cookbook7[349:a0b] -[ViewController parser:didStartElement:namespaceURI:qualifiedName:attributes:]

2014-06-27 09:29:40.080 cookbook7[349:a0b] elementName=person namespaceURI=(null) qName=(null) attributeDict={

    id = 1;

}

2014-06-27 09:29:40.081 cookbook7[349:a0b] -[ViewController parser:foundCharacters:]

2014-06-27 09:29:40.081 cookbook7[349:a0b]  

2014-06-27 09:29:40.081 cookbook7[349:a0b] -[ViewController parser:didStartElement:namespaceURI:qualifiedName:attributes:]

2014-06-27 09:29:40.082 cookbook7[349:a0b] elementName=firstName namespaceURI=(null) qName=(null) attributeDict={

}

2014-06-27 09:29:40.082 cookbook7[349:a0b] -[ViewController parser:foundCharacters:]

2014-06-27 09:29:40.083 cookbook7[349:a0b] Anthony

2014-06-27 09:29:40.083 cookbook7[349:a0b] -[ViewController parser:didEndElement:namespaceURI:qualifiedName:]

2014-06-27 09:29:40.084 cookbook7[349:a0b] elementName=firstName namespaceURI=(null) qName=(null)

2014-06-27 09:29:40.084 cookbook7[349:a0b] -[ViewController parser:foundCharacters:]

2014-06-27 09:29:40.084 cookbook7[349:a0b]  

2014-06-27 09:29:40.085 cookbook7[349:a0b] -[ViewController parser:didStartElement:namespaceURI:qualifiedName:attributes:]

2014-06-27 09:29:40.085 cookbook7[349:a0b] elementName=lastName namespaceURI=(null) qName=(null) attributeDict={

}

2014-06-27 09:29:40.086 cookbook7[349:a0b] -[ViewController parser:foundCharacters:]

2014-06-27 09:29:40.086 cookbook7[349:a0b] Robbins

2014-06-27 09:29:40.087 cookbook7[349:a0b] -[ViewController parser:didEndElement:namespaceURI:qualifiedName:]

2014-06-27 09:29:40.087 cookbook7[349:a0b] elementName=lastName namespaceURI=(null) qName=(null)

2014-06-27 09:29:40.087 cookbook7[349:a0b] -[ViewController parser:foundCharacters:]

2014-06-27 09:29:40.088 cookbook7[349:a0b]  

2014-06-27 09:29:40.088 cookbook7[349:a0b] -[ViewController parser:didStartElement:namespaceURI:qualifiedName:attributes:]

2014-06-27 09:29:40.089 cookbook7[349:a0b] elementName=age namespaceURI=(null) qName=(null) attributeDict={

}

2014-06-27 09:29:40.089 cookbook7[349:a0b] -[ViewController parser:foundCharacters:]

2014-06-27 09:29:40.089 cookbook7[349:a0b] 51

2014-06-27 09:29:40.090 cookbook7[349:a0b] -[ViewController parser:didEndElement:namespaceURI:qualifiedName:]

2014-06-27 09:29:40.090 cookbook7[349:a0b] elementName=age namespaceURI=(null) qName=(null)

2014-06-27 09:29:40.091 cookbook7[349:a0b] -[ViewController parser:didEndElement:namespaceURI:qualifiedName:]

2014-06-27 09:29:40.091 cookbook7[349:a0b] elementName=person namespaceURI=(null) qName=(null)

2014-06-27 09:29:40.091 cookbook7[349:a0b] -[ViewController parser:didStartElement:namespaceURI:qualifiedName:attributes:]

2014-06-27 09:29:40.092 cookbook7[349:a0b] elementName=person namespaceURI=(null) qName=(null) attributeDict={

    id = 2;

}

2014-06-27 09:29:40.092 cookbook7[349:a0b] -[ViewController parser:foundCharacters:]

2014-06-27 09:29:40.093 cookbook7[349:a0b]  

2014-06-27 09:29:40.093 cookbook7[349:a0b] -[ViewController parser:didStartElement:namespaceURI:qualifiedName:attributes:]

2014-06-27 09:29:40.094 cookbook7[349:a0b] elementName=firstName namespaceURI=(null) qName=(null) attributeDict={

}

2014-06-27 09:29:40.094 cookbook7[349:a0b] -[ViewController parser:foundCharacters:]

2014-06-27 09:29:40.094 cookbook7[349:a0b] Richard

2014-06-27 09:29:40.095 cookbook7[349:a0b] -[ViewController parser:didEndElement:namespaceURI:qualifiedName:]

2014-06-27 09:29:40.095 cookbook7[349:a0b] elementName=firstName namespaceURI=(null) qName=(null)

2014-06-27 09:29:40.096 cookbook7[349:a0b] -[ViewController parser:foundCharacters:]

2014-06-27 09:29:40.096 cookbook7[349:a0b]  

2014-06-27 09:29:40.096 cookbook7[349:a0b] -[ViewController parser:didStartElement:namespaceURI:qualifiedName:attributes:]

2014-06-27 09:29:40.097 cookbook7[349:a0b] elementName=lastName namespaceURI=(null) qName=(null) attributeDict={

}

2014-06-27 09:29:40.097 cookbook7[349:a0b] -[ViewController parser:foundCharacters:]

2014-06-27 09:29:40.098 cookbook7[349:a0b] Branson

2014-06-27 09:29:40.098 cookbook7[349:a0b] -[ViewController parser:didEndElement:namespaceURI:qualifiedName:]

2014-06-27 09:29:40.098 cookbook7[349:a0b] elementName=lastName namespaceURI=(null) qName=(null)

2014-06-27 09:29:40.099 cookbook7[349:a0b] -[ViewController parser:foundCharacters:]

2014-06-27 09:29:40.099 cookbook7[349:a0b]  

2014-06-27 09:29:40.100 cookbook7[349:a0b] -[ViewController parser:didStartElement:namespaceURI:qualifiedName:attributes:]

2014-06-27 09:29:40.100 cookbook7[349:a0b] elementName=age namespaceURI=(null) qName=(null) attributeDict={

}

2014-06-27 09:29:40.100 cookbook7[349:a0b] -[ViewController parser:foundCharacters:]

2014-06-27 09:29:40.101 cookbook7[349:a0b] 61

2014-06-27 09:29:40.101 cookbook7[349:a0b] -[ViewController parser:didEndElement:namespaceURI:qualifiedName:]

2014-06-27 09:29:40.102 cookbook7[349:a0b] elementName=age namespaceURI=(null) qName=(null)

2014-06-27 09:29:40.102 cookbook7[349:a0b] -[ViewController parser:didEndElement:namespaceURI:qualifiedName:]

2014-06-27 09:29:40.103 cookbook7[349:a0b] elementName=person namespaceURI=(null) qName=(null)

2014-06-27 09:29:40.103 cookbook7[349:a0b] -[ViewController parser:didEndElement:namespaceURI:qualifiedName:]

2014-06-27 09:29:40.103 cookbook7[349:a0b] elementName=root namespaceURI=(null) qName=(null)

2014-06-27 09:29:40.104 cookbook7[349:a0b] The XML is parsed.rootElement=<root><person id=1>   <firstName>Anthony</firstName><lastName>Robbins</lastName><age>51</age></person><person id=2>   <firstName>Richard</firstName><lastName>Branson</lastName><age>61</age></person></root>








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值