IOS 中的XML解析
首先说一下,在IOS中XML解析和在Android中的SAX或者Pull解析差别不大,都是基于事件的解析方式。
首先,定义一个对象来表示XML的文档结构
XMLElement.h
#import <Foundation/Foundation.h>
@interface XMLElement : NSObject // 标签名称 @property (nonatomic,strong) NSString *name; // 标签的文本(注意在上一级标签和下一级标签之间室友文本的) @property (nonatomic,strong) NSString *text; // 标签的属性 @property (nonatomic,strong) NSDictionary *attributes; // 子标签集合 @property (nonatomic,strong) NSMutableArray *subElements; // 上一级标签 @property (nonatomic,strong) XMLElement *parent;
@end |
XMLElement.m
#import "XMLElement.h"
@implementation XMLElement
@synthesize name,text,attributes,subElements,parent;
-(NSMutableArray *) subElements { if(subElements == nil){ subElements = [[NSMutableArray alloc]init]; } return subElements; }
@end |
XML文件的内容放在/Supporting File/的Group下面。名称为person.xml
<?xml version="1.0" encoding="UTF-8"?> <root> <person id="1"> <firstName>zhang</firstName> <lastName>sansan</lastName> <age>21</age> </person> <person id="2"> <firstName>li</firstName> <lastName>sisisi</lastName> <age>31</age> </person> </root> |
解析的ViewController.h
#import <UIKit/UIKit.h> #import "XMLElement.h"
@interface ViewController : UIViewController <NSXMLParserDelegate> // 解析器对象 @property (nonatomic,strong) NSXMLParser *parser; // 根元素 @property (nonatomic,strong) XMLElement *rootElement; // 当前的元素 @property (nonatomic,strong) XMLElement *currentElementPointer;
@end |
解析的ViewController.m
#import "ViewController.h" #import "UIColor+ColorWithARGB.h"
@interface ViewController ()
@end
@implementation ViewController
-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if(self != nil){ self.title = @"XML解析"; } return self; }
- (void)viewDidLoad { [super viewDidLoad];
self.view.backgroundColor = [UIColor r:0xA5 g:0xA5 b:0x52];
NSString *xmlFilePath = [[NSBundle mainBundle]pathForResource:@"person" ofType:@"xml"]; NSData *data = [[NSData alloc]initWithContentsOfFile:xmlFilePath];
self.parser = [[NSXMLParser alloc]initWithData:data]; self.parser.delegate = self;
if([self.parser parse]){ NSLog(@"The XML is Parsed"); NSMutableString *str = [[NSMutableString alloc]init]; [str appendFormat:@"%@\n",self.rootElement.name]; NSMutableArray *subs = self.rootElement.subElements; for(int i = 0;i < [subs count];i++){ XMLElement *personElement = [subs objectAtIndex:i]; [str appendFormat:@"\tname:%@",personElement.name]; [str appendFormat:@",text:%@\n",personElement.text]; NSArray *subPersonElements = personElement.subElements; for(int j = 0;j < [subPersonElements count];j++){ XMLElement *subElement = [subPersonElements objectAtIndex:j]; [str appendFormat:@"\t\tname:%@",subElement.name]; [str appendFormat:@",text:%@\n",subElement.text]; } }
NSLog(@"======解析结果:%@" ,str);
}else{ NSLog(@"Failed to parse the XML"); } }
- (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. }
// 文档开始 -(void)parserDidStartDocument:(NSXMLParser *)parser { self.rootElement = nil; self.currentElementPointer = nil; } // 文档结束 -(void)parserDidEndDocument:(NSXMLParser *)parser { self.currentElementPointer = nil; } // 元素开始 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { if(self.rootElement == nil){ self.rootElement = [[XMLElement alloc]init]; self.currentElementPointer = self.rootElement; }else{ 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; NSLog(@"name:%@" , elementName); } // 元素结束 - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { self.currentElementPointer = self.currentElementPointer.parent; NSLog(@"end name:%@" , elementName); } // 解析文本,会多次解析,每次只解析1000个字符,如果多月1000个就会多次进入这个方法 - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { if([self.currentElementPointer.text length] > 0){ self.currentElementPointer.text = [self.currentElementPointer.text stringByAppendingString:string]; }else{ self.currentElementPointer.text = [NSMutableString stringWithString:string]; }
NSLog(@"string:%@" , string); } @end |