参考:http://my.oschina.net/LouWk/blog/112978
XML解析一般分俩种模式SAX和DOM,事件和文档。
SAX解析:事物模型解析,从头开始读取文档然后根据读取到的头标签时要怎么处理,读完头标签后,理论上是读取标签值,然后读取后遇到结束标签等。
只在xml文档中查找特定条件的内容,并且只提取需要的内容。这样占用内存小,灵活。缺点就是写。
DOM解析:把整个xml文档一次性读出,放在一个树形结构里。在需要的时候查找特定节点,然后对节点进行读和写。主要优势是实现简单,读写平衡;缺点是比较占内存,因为把整个xml文档都读入内存,文件越大缺点就越明显。
NSXMLParser详解
initWithContentsOfURL通过NSURL创建解析器
initWithData通过NSData创建解析器
setDelegate为解析器定义委托
parse运行解析器
例子
NSString *str = [NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\
<Books>\
<Book id=\"1\">\
<title>Circumference</title>\
<author>Nicholas Nicastro</author>\
<summary>Eratosthenes and the Ancient</summary>\
</Book>\
<Book id=\"2\">\
<title>Copernicus Secret</title>\
<author>Jack Repcheck</author>\
<summary>How the scientific revolution began</summary>\
</Book> \
<Book id=\"3\"> \
<title>Angels and Demons</title> \
<author>Dan Brown</author> \
<summary>Robert Langdon is summoned to a Swiss</summary> \
</Book> \
</Books> "];
- (BOOL)parser:(NSString *)string{GdataxML详解NSXMLParser *par = [[NSXMLParser alloc] initWithData:[string dataUsingEncoding:NSUTF8StringEncoding]];//传递你要解析的数据
[par setDelegate:self];
return [par parse];//启动解析
}
//step 1 准备解析
- (void)parserDidStartDocument:(NSXMLParser *)parser{
self.parserObjects = [[NSMutableArray alloc] initWithCapacity:0];
}
//step 2 读取第一个头节点,如果内部有属性值,你可以获取出来
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
NSLog(@"elementName:%@\nnamespaceURI:%@\nqName:%@\n",elementName,namespaceURI,qName);
NSLog(@"attributes:%@",attributeDict);
}
//step 3 获得首尾节点间的内容
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
//获得首位节点间内容
NSLog(@"string:%@",string);
}
//step 4 解析完当前节点
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
//解析完当前节点
NSLog(@"tail..............");
NSLog(@"elementName:%@\nnamespaceURI:%@\nqName:%@",qName);
}
//step 5 解析结束
- (void)parserDidEndDocument:(NSXMLParser *)parser{
}
//step 6 获取cdata块数据
- (void)parser:(NSXMLParser *)parser foundCDATA:(NSData *)CDATABlock{
}
GdataxMLDocument:xml解析入口
GdataxMLElement:保存查找的数据
GdataxMLNode:保存解析的数据
NSError *error;
NSData *data = [NSData dataWithData:[str dataUsingEncoding:NSUTF8StringEncoding]];
//设置GdataxMLDocument
GdataxMLDocument *gdataxML = [[GdataxMLDocument alloc] initWithData:data options:0 error:&error];
//解析
GdataxMLElement *rootElement = [gdataxML rootElement];
NSArray *arrStu = [rootElement elementsForName:@"Book"];
NSMutableString *str1 = [[NSMutableString alloc] initWithCapacity:0];
for (GdataxMLNode *node in arrStu) {
[str1 appendFormat:@"=========book==========\n"];
for (int k = 0; k < [node childCount]; k++) {
GdataxMLNode *sub_node = [node childAtIndex:k];
switch (k) {
case 0:
[str1 appendFormat:@"title=%@\r\n",[sub_node stringValue]];
break;
case 1:
[str1 appendFormat:@"author=%@\r\n",[sub_node stringValue]];
break;
case 2:
[str1 appendFormat:@"summary=%@\r\n",[sub_node stringValue]];
break;
default:
break;
}
}
}