NSXML是ios SDK自带的,也是苹果默认的解析框架,它采用SAX模式解析,是SAX解析模式的代表。NSXML框架的核心是NSXMLParser和它的委托协议NSXMLParserDelegate。
1、例子Notes.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Notes>
<Note id="1">
<CDate>2012-12-21</CDate>
<Content>iosBOOK_1</Content>
<UserID>tony</UserID>
</Note>
<Note id="2">
<CDate>2012-12-22</CDate>
<Content>iosBOOK_2</Content>
<UserID>tony</UserID>
</Note>
<Note id="3">
<CDate>2012-12-23</CDate>
<Content>iosBOOK_3</Content>
<UserID>tony</UserID>
</Note>
<Note id="4">
<CDate>2012-12-24</CDate>
<Content>iosBOOK_4</Content>
<UserID>tony</UserID>
</Note>
<Note id="5">
<CDate>2012-12-25</CDate>
<Content>iosBOOK_5</Content>
<UserID>tony</UserID>
</Note>
<Note id="6">
<CDate>2012-12-26</CDate>
<Content>iosBOOK_6</Content>
<UserID>tony</UserID>
</Note>
</Notes>
2、编写一个专门解析XML文件的类(NotesXMLParser):
- (void)start
{
// 在整个程序包里面搜索Notes.xml
NSString *path = [[NSBundle mainBundle] pathForResource:@"Notes" ofType:@"xml"];
NSURL *url = [NSURL fileURLWithPath:path];
NSXMLParser *m_Parser = [[[NSXMLParser alloc] initWithContentsOfURL:url] autorelease];
m_Parser.delegate = self;
[m_Parser parse];
}
// 解析文档开始
- (void)parserDidStartDocument:(NSXMLParser *)parser
{
_notes = [[NSMutableArray alloc] init];
}
// 解析文档结束
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
// 使用KVO模式,通知中心机制
[[NSNotificationCenter defaultCenter] postNotificationName:@"reloadXMLData" object:_notes userInfo:nil];
[_notes removeAllObjects];
_notes = nil;
}
// 解析开始标签
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
_curTagName = elementName;
if ([_curTagName isEqualToString:@"Note"])
{
NSString *_id = [attributeDict objectForKey:@"id"];
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setObject:_id forKey:@"id"];
[_notes addObject:dict];
[dict release];
}
}
// 解析结束标签
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
_curTagName = nil;
}
// 解析字符串
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
string = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
if ([string isEqualToString:@""])
return;
NSMutableDictionary *dict = [_notes lastObject];
if ([_curTagName isEqualToString:@"CDate" ] && dict)
{
[dict setObject:string forKey:@"CDate"];
}
else if ([_curTagName isEqualToString:@"Content"] && dict)
{
[dict setObject:string forKey:@"Content"];
}
else if ([_curTagName isEqualToString:@"UserID"])
{
[dict setObject:string forKey:@"UserID"];
}
}
#if M_COMPILE == DEBUG
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
{
NSLog(@"解析错误:%@",parseError);
}
#endif
3、实际使用:
<pre name="code" class="cpp">- (void)initObserver
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getXMLData:) name:@"reloadXMLData" object:nil];
// 开始解析xml文件
NotesXMLParser *parser = [[NotesXMLParser alloc] init];
[parser start];
[parser release];
}
- (void)getXMLData:(NSNotification *)notification
{
NSMutableArray *xmlData = [notification object];
NSLog(@"xmlData:%@",xmlData);
}
至此,NSXMLParser的介绍已经完毕,效果如下:
2014-08-30 11:14:27.671 test71[6436:60b] xmlData:(
{
CDate = "2012-12-21";
Content = "iosBOOK_1";
UserID = tony;
id = 1;
},
{
CDate = "2012-12-22";
Content = "iosBOOK_2";
UserID = tony;
id = 2;
},
{
CDate = "2012-12-23";
Content = "iosBOOK_3";
UserID = tony;
id = 3;
},
{
CDate = "2012-12-24";
Content = "iosBOOK_4";
UserID = tony;
id = 4;
},
{
CDate = "2012-12-25";
Content = "iosBOOK_5";
UserID = tony;
id = 5;
},
{
CDate = "2012-12-26";
Content = "iosBOOK_6";
UserID = tony;
id = 6;
}
)