一、概述
由于xml具有强大的扩展性及清晰的结构,使其广泛用于各种文件配置,比如皮肤配置;那么在IOS该如何解析xml文件呢?xml解析必然要用到xml解析库,有libxml、tinyxml等,但在IOS的API中提供了NSXMLParser类,通过NSXMLParser可以实现快速访问xml中相关字段;
二、NSXMLParser类几个重要知识点
1、要使用NSXMLParser类,必须遵循NSXMLParserDelegate协议,即在自身类声明时,必须加上<NSXMLParserDelegate>
2、必须设置代理,这样才能够访问自身重定义的方法,即才能处理xml中数据;
3、以下对NSXMLParserDelegate协议中几个常用的方法进行说明:
- (void)parserDidStartDocument:(NSXMLParser *)parser;
该方法将在开始parse之前调用,用处是可以在其中对相应的对象进行分配和初始化;
- (void)parserDidEndDocument:(NSXMLParser *)parser;
该方法将在parse结束后调用,用处是进行相应的资源释放和处理;
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict;
该方法将在parse期间碰到元素开始标志"<xxx"时调用,用于元素属性获取,其中elementName为元素名,attributeDict为相应的属性集合;
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName;
该方法是在遇到元素结束标志"</xxx>"调用;
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string;
该方法是遇到元素值时调用,通过它可以获取元素内容;
三、实例
/***************************************************************
** type.xml **
***************************************************************/
<?xml version="1.0" encoding="utf-8"?>
< skin>
<string name="title" id="1">学习xml解析</string>
<string name="content" id="1">hello world</string>
< /skin>
< skin>
<string name="title" id="1">学习xml解析</string>
<string name="content" id="1">hello world</string>
< /skin>
ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController<NSXMLParserDelegate>
{
NSMutableArray *viewArray;
}
@end
ViewController.m
- (void)viewDidLoad
{
[super viewDidLoad];
NSString * path = [[NSBundle mainBundle] pathForResource:@"type" ofType:@"xml"];
NSLog(@"path:%@",path);
NSData *xmlData = [NSData dataWithContentsOfFile:path];
NSXMLParser *tempParser = [[NSXMLParser alloc] initWithData:xmlData];
[tempParser setShouldProcessNamespaces:NO];
[tempParser setShouldReportNamespacePrefixes:NO];
[tempParser setShouldResolveExternalEntities:NO];
[tempParser setDelegate:self];
[tempParser parse];
// Do any additional setup after loading the view, typically from a nib.
}
{
[super viewDidLoad];
NSString * path = [[NSBundle mainBundle] pathForResource:@"type" ofType:@"xml"];
NSLog(@"path:%@",path);
NSData *xmlData = [NSData dataWithContentsOfFile:path];
NSXMLParser *tempParser = [[NSXMLParser alloc] initWithData:xmlData];
[tempParser setShouldProcessNamespaces:NO];
[tempParser setShouldReportNamespacePrefixes:NO];
[tempParser setShouldResolveExternalEntities:NO];
[tempParser setDelegate:self];
[tempParser parse];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
//alloc
NSLog(@"=======start parse=========");
viewArray = [[NSMutableArray alloc] init];
}
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
NSLog(@"=======end parse=========");
}
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
NSLog(@"=======start element:%@=========", elementName);
if ([elementName isEqualToString:@"skin"]) {
NSLog(@"skin name=%@", [attributeDict objectForKey:@"name"]);
} else if ([elementName isEqualToString:@"string"]) {
NSLog(@"string name= %@ id=%@", [attributeDict objectForKey:@"name"], [attributeDict objectForKey:@"id"]);
}
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
NSLog(@"=======end element:%@=========", elementName);
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
NSLog(@"=======element content=%@=====", string);
}
@end
{
//alloc
NSLog(@"=======start parse=========");
viewArray = [[NSMutableArray alloc] init];
}
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
NSLog(@"=======end parse=========");
}
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
NSLog(@"=======start element:%@=========", elementName);
if ([elementName isEqualToString:@"skin"]) {
NSLog(@"skin name=%@", [attributeDict objectForKey:@"name"]);
} else if ([elementName isEqualToString:@"string"]) {
NSLog(@"string name= %@ id=%@", [attributeDict objectForKey:@"name"], [attributeDict objectForKey:@"id"]);
}
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
NSLog(@"=======end element:%@=========", elementName);
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
NSLog(@"=======element content=%@=====", string);
}
@end
2013-12-10 16:22:30.949 xmlParserTest[2048:a0b] path:/Users/li.peng/Library/Application Support/iPhone Simulator/7.0/Applications/FEDF5F50-36B2-4542-9E95-50C8422FF6A5/xmlParserTest.app/type.xml
2013-12-10 16:22:30.951 xmlParserTest[2048:a0b] =======start parse=========
2013-12-10 16:22:30.952 xmlParserTest[2048:a0b] ======start element =========skin
2013-12-10 16:22:30.952 xmlParserTest[2048:a0b] skin name=skin1
2013-12-10 16:22:30.952 xmlParserTest[2048:a0b] =====element content=====
2013-12-10 16:22:30.953 xmlParserTest[2048:a0b] =====element content=====
2013-12-10 16:22:30.953 xmlParserTest[2048:a0b] ======start element =========string
2013-12-10 16:22:30.953 xmlParserTest[2048:a0b] string name =title id = 1
2013-12-10 16:22:30.953 xmlParserTest[2048:a0b] =====element content=====xue xi xml jiexi
2013-12-10 16:22:30.954 xmlParserTest[2048:a0b] ==============end element==string
2013-12-10 16:22:30.954 xmlParserTest[2048:a0b] =====element content=====
2013-12-10 16:22:30.954 xmlParserTest[2048:a0b] ======start element =========string
2013-12-10 16:22:30.955 xmlParserTest[2048:a0b] string name =content id = 1
2013-12-10 16:22:30.955 xmlParserTest[2048:a0b] =====element content===== hello xml
2013-12-10 16:22:30.955 xmlParserTest[2048:a0b] ==============end element==string
2013-12-10 16:22:30.957 xmlParserTest[2048:a0b] =====element content=====
2013-12-10 16:22:30.958 xmlParserTest[2048:a0b] =====element content=====
2013-12-10 16:22:30.958 xmlParserTest[2048:a0b] ==============end element==skin
2013-12-10 16:22:30.959 xmlParserTest[2048:a0b] =======end parse=========
2013-12-10 16:22:30.951 xmlParserTest[2048:a0b] =======start parse=========
2013-12-10 16:22:30.952 xmlParserTest[2048:a0b] ======start element =========skin
2013-12-10 16:22:30.952 xmlParserTest[2048:a0b] skin name=skin1
2013-12-10 16:22:30.952 xmlParserTest[2048:a0b] =====element content=====
2013-12-10 16:22:30.953 xmlParserTest[2048:a0b] =====element content=====
2013-12-10 16:22:30.953 xmlParserTest[2048:a0b] ======start element =========string
2013-12-10 16:22:30.953 xmlParserTest[2048:a0b] string name =title id = 1
2013-12-10 16:22:30.953 xmlParserTest[2048:a0b] =====element content=====xue xi xml jiexi
2013-12-10 16:22:30.954 xmlParserTest[2048:a0b] ==============end element==string
2013-12-10 16:22:30.954 xmlParserTest[2048:a0b] =====element content=====
2013-12-10 16:22:30.954 xmlParserTest[2048:a0b] ======start element =========string
2013-12-10 16:22:30.955 xmlParserTest[2048:a0b] string name =content id = 1
2013-12-10 16:22:30.955 xmlParserTest[2048:a0b] =====element content===== hello xml
2013-12-10 16:22:30.955 xmlParserTest[2048:a0b] ==============end element==string
2013-12-10 16:22:30.957 xmlParserTest[2048:a0b] =====element content=====
2013-12-10 16:22:30.958 xmlParserTest[2048:a0b] =====element content=====
2013-12-10 16:22:30.958 xmlParserTest[2048:a0b] ==============end element==skin
2013-12-10 16:22:30.959 xmlParserTest[2048:a0b] =======end parse=========