您的位置:首页 > 其它

11.12. Parsing XML with NSXMLParser

2014-06-27 09:35 357 查看
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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: