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>