NSXMLParser解析简要说明
.是sax方法解析
.需要创建NSXMLParser实例 (alloc)
并创建解析器 (initWithData:)
为解析器定义委托 (setDelegate:)
运行解析器 (parser)
++++++当parser初始化并执行parse语句时([parser parse]),程序会跳到代理方法里面走第一个代理方法++++++
.这种解析方式是利用它的代理NSXMLParserDelegate实现的
第一个代理方法:开始处理xml数据,它会把整个xml遍历一遍,识别元素节点名称
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict;
第二个代理方法:也就是得到文本节点里存储的信息数据
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string;
第三个代理方法:存储从第二个代理方法中获取到的信息
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
这就是解析的过程,在这个过程中会不停的重复的执行这三个代理方法,直到遍历完成 另外:
解析开始执行的方法
- (void)parserDidStartDocument:(NSXMLParser *)parser;
解析结束执行的方法
- (void)parserDidEndDocument:(NSXMLParser *)parser;
当出现解析错误的时候,会执行这个方法
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError;
 /*
xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<Student >
<dict id="1001">
<key>姓名</key>
<string>刘冠</string>
</dict>
<dict id="1002">
<key>姓名</key>
<string>李勇</string>
</dict>
</Student>
*/
#import "ViewController.h" @interface ViewController ()<NSXMLParserDelegate>
{
NSMutableArray *contents;
NSString *elementTag;
}
@end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"%s",__FUNCTION__);//调用该方法时,打印该方法的名字
//解析当前工程文件
NSXMLParser *parserFile = [[NSXMLParser alloc] initWithData:[NSData dataWithContentsOfFile:[[NSBundle mainBundle]pathForResource:@"Student" ofType:@"xml"]]]; parserFile.delegate = self;
[parserFile parse];//开始解析
}
//开始解析xml文件,在解析节点前,可以在该方法中做一些初始化的工作,此方法只有开始解析时调用一次
-(void)parserDidStartDocument:(NSXMLParser *)parser{
NSLog(@"%s",__FUNCTION__);
//初始化数组,用于存储解析出来的数据
contents = [NSMutableArray array];
} /*第一个代理方法与第二个代理方法会交替调用*/ //第一个代理方法(开始处理xml数据,它会把整个xml遍历一遍,识别元素开始节点名称 )注意:该方法不是一下就执行完了,它会携带者后面的两个方法进行具体的操作(通过NSLog(@"%s",__FUNCTION__);方法可以查看方法的调用)
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
NSLog(@"%s",__FUNCTION__);
// NSLog(@"parser = %@\n",parser);
// NSLog(@"didStartElement = %@\n",elementName);//是当前解析的标签名
// NSLog(@"namespaceURI = %@\n",namespaceURI);
// NSLog(@"qualifiedName = %@\n",qName);
// NSLog(@"attributes = %@\n",attributeDict);//属性里边包含的值<Student version="1.0">
// NSLog(@"*****************");
elementTag = elementName;//用于后面的信息重建
//判断是否是<dict>节点
if([elementName isEqualToString:@"dict"])
{
//在<dict>节点的前提下提取属性节点<dict id="1002">
NSString *s = [attributeDict objectForKey:@"id"];//属性为区分同名节点而生(与节点绑定在一块)
NSMutableDictionary *dic = [NSMutableDictionary dictionary];
[dic setObject:s forKey:@"id"];
[contents addObject:dic];
} }
//第二个代理方法(一般第一个和第三个代理方法执行后都会调用此方法),作用为查找标签伴随的特征 //<dict id="1001">
//<..>解析到此处(内容)<..>;或者<..> <..>;就是换行时也会调用(总之就是非标签处) //</dict>
//解析器,从两个结点之间读取具体内容
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
NSLog(@"%s",__FUNCTION__);
//该方法主要是解析元素文本的主要场所,由于换行符和回车符等特殊字符也会触发该方法,因此要判断并剔除换行符和回车符
//获取标签存储的字符串
if([elementTag isEqualToString:@"key"]||[elementTag isEqualToString:@"string"])
{
[[contents lastObject] setObject:string forKey:elementTag];
}
}
//第三个代理方法(遇到结束标签调用此方法),之后再去调用第二个代理方法(查找特征)所以此处要把elementTag置为nil
//解析标签结束</..>
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
NSLog(@"%s",__FUNCTION__);
//解析头标签结束之后,将elementTag置空,避免尾标签对foundCharacters造成的影响
elementTag = nil;
}
//解析结束
-(void)parserDidEndDocument:(NSXMLParser *)parser{
//NSLog(@"--%@",listArr);
NSLog(@"%s",__FUNCTION__);
for (NSDictionary *dic in contents) {
NSLog(@"-->%@,%@,%@",[dic objectForKey:@"id"],dic[@"key"],dic[@"string"]);
}
}
//解析出错
-(void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError{
NSLog(@"%s",__FUNCTION__);
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
/*
注意:
解析xml数据的时候,
每当遇到元素节点的时候都会执行第一个代理方法,如果有属性节点,可以直接在这个方法中获取里面的值;
每当遇到文本节点的时候都会执行第二个代理方法,获取文本节点中的值然后到第三个方法中进行区分。
如果是换行符的话也会获取,因为换行符也是文本节点,不过当一个元素节点结束后的换行符是不会获取的。
比如说: (换行符1)
<li>文本节点</li>
(换行符2)
元素节点前后各有一个换行符,这时只会获取换行符1,而不会获取换行符2。
*/
//附件:方法执行顺序
/*
2015-12-04 22:08:28.742 解析[1597:188134] -[ViewController viewDidLoad]
2015-12-04 22:08:28.743 解析[1597:188134] -[ViewController parserDidStartDocument:]
2015-12-04 22:08:28.743 解析[1597:188134] -[ViewController parser:didStartElement:namespaceURI:qualifiedName:attributes:]
2015-12-04 22:08:28.743 解析[1597:188134] -[ViewController parser:foundCharacters:]
2015-12-04 22:08:28.743 解析[1597:188134] -[ViewController parser:didStartElement:namespaceURI:qualifiedName:attributes:]
2015-12-04 22:08:28.743 解析[1597:188134] -[ViewController parser:foundCharacters:]
2015-12-04 22:08:28.744 解析[1597:188134] -[ViewController parser:didStartElement:namespaceURI:qualifiedName:attributes:]
2015-12-04 22:08:28.744 解析[1597:188134] -[ViewController parser:foundCharacters:]
2015-12-04 22:08:28.744 解析[1597:188134] -[ViewController parser:didEndElement:namespaceURI:qualifiedName:]
2015-12-04 22:08:28.744 解析[1597:188134] -[ViewController parser:foundCharacters:]
2015-12-04 22:08:28.744 解析[1597:188134] -[ViewController parser:didStartElement:namespaceURI:qualifiedName:attributes:]
2015-12-04 22:08:28.744 解析[1597:188134] -[ViewController parser:foundCharacters:]
2015-12-04 22:08:28.744 解析[1597:188134] -[ViewController parser:didEndElement:namespaceURI:qualifiedName:]
2015-12-04 22:08:28.745 解析[1597:188134] -[ViewController parser:foundCharacters:]
2015-12-04 22:08:28.745 解析[1597:188134] -[ViewController parser:didEndElement:namespaceURI:qualifiedName:]
2015-12-04 22:08:28.745 解析[1597:188134] -[ViewController parser:foundCharacters:]
2015-12-04 22:08:28.745 解析[1597:188134] -[ViewController parser:didStartElement:namespaceURI:qualifiedName:attributes:]
2015-12-04 22:08:28.745 解析[1597:188134] -[ViewController parser:foundCharacters:]
2015-12-04 22:08:28.745 解析[1597:188134] -[ViewController parser:didStartElement:namespaceURI:qualifiedName:attributes:]
2015-12-04 22:08:28.745 解析[1597:188134] -[ViewController parser:foundCharacters:]
2015-12-04 22:08:28.746 解析[1597:188134] -[ViewController parser:didEndElement:namespaceURI:qualifiedName:]
2015-12-04 22:08:28.746 解析[1597:188134] -[ViewController parser:foundCharacters:]
2015-12-04 22:08:28.746 解析[1597:188134] -[ViewController parser:didStartElement:namespaceURI:qualifiedName:attributes:]
2015-12-04 22:08:28.746 解析[1597:188134] -[ViewController parser:foundCharacters:]
2015-12-04 22:08:28.746 解析[1597:188134] -[ViewController parser:didEndElement:namespaceURI:qualifiedName:]
2015-12-04 22:08:28.746 解析[1597:188134] -[ViewController parser:foundCharacters:]
2015-12-04 22:08:28.746 解析[1597:188134] -[ViewController parser:didEndElement:namespaceURI:qualifiedName:]
2015-12-04 22:08:28.747 解析[1597:188134] -[ViewController parser:foundCharacters:]
2015-12-04 22:08:28.747 解析[1597:188134] -[ViewController parser:didEndElement:namespaceURI:qualifiedName:]
2015-12-04 22:08:28.747 解析[1597:188134] -[ViewController parserDidEndDocument:]
*/
@end

NSXMLParser解析本地.xml数据(由于like7xiaoben写的太好了,我从她那里粘贴过来的)的更多相关文章

  1. Android 通过Dom, Sax, Pull解析网络xml数据

    这篇文章不是完全原创,XML解析的部分参考了 liuhe688 的文章.文章地址:http://blog.csdn.net/liuhe688/article/details/6415593 这是一个几 ...

  2. [javascript]—jQuery解析本地 XML 文档

    Create a jQuery object using an XML string and obtain the value of the title node. <!doctype html ...

  3. iOS 详解NSXMLParser方法解析XML数据方法

    前一篇文章已经介绍了如何通过URL从网络上获取xml数据.下面介绍如何将获取到的数据进行解析. 下面先看看xml的数据格式吧! <?xml version="1.0" enc ...

  4. XML数据 JSON数据 LitJSON 数据 的编写和解析 小结

    用XML生成如下数据<?xml version="1.0"encoding="UTF-8"?><Transform name="My ...

  5. iOS开发——网络Swift篇&JSON与XML数据解析

    JSON与XML数据解析 JSON数据解析(内置NSJSONSerialization与第三方JSONKit)   一,使用自带的NSJSONSerialization 苹果从IOS5.0后推出了SD ...

  6. 如何解析本地和线上XML文件获取相应的内容

    一.使用Dom解析本地XML 1.本地XML文件为:test.xml <?xml version="1.0" encoding="UTF-8"?> ...

  7. xml数据解析和生成

    java中xml的解析方式有许多,有java自带的DOM.SAX,android中的PULL,其它的还有DOM4J.JDOM等. 本文简要讲述DOM.SAX.PULL三种方式. 1.DOM方法 缺点: ...

  8. iOS - XML 数据解析

    前言 @interface NSXMLParser : NSObject public class NSXMLParser : NSObject 1.XML 数据 XML(Extensible Mar ...

  9. iOS解析XML数据

    iOS中解析XML数据的类是  NSXMLParser,详细使用方法如下: 假设现在在内存中有XML的二进制数据对象(NSData):data(该数据可能来自网络,也可能是本地的文件数据),设置NSX ...

随机推荐

  1. ASP.NET MVC 数据库依赖缓存的实现

    当数据库中的信息发生变化的时候,应用程序能够获取变化的通知是缓存依赖得以实现的基础.应用程序可以通过轮询获取数据变化的信息,使用轮询的话也不可能重新查一次后再和以前的数据做比较,如果这样的话如果我一个 ...

  2. Eclipse添加代码注释模板

    Eclipse支持我们自定义模板,比如文件的注释,类注释,函数注释等功能.eclipse自身有自带的模板,我们也可以自己定义.一次点击:windows->preference—>java- ...

  3. linux下部署项目问题

    1. 今天linux下部署thinkphp项目,数据库用的mysql. 页面其他都是正常的,但是从数据库中取出的数据都是乱码.最后查了资料 解决方案: 在ThinkPHP里面 Library\Thin ...

  4. python 批量更改文件名

    工作中遇到一种情况,就是市场部那边经常发过来一些apk的包 但是要求更改名字,文件太多了,没办法,只有想办法了,还好命名都是有规则的 比如说 YZLoan-gdtyyb-V2.23.apk------ ...

  5. 【转】向HTML中插入视频并兼容所有浏览器的方法

    原文地址:http://www.jb51.net/web/168548.html 向HTML中插入视频有两种方法,一种是古老的object标签,一种是html5中的video标签,前者兼容性相对好些, ...

  6. 一、项目基础架构(附GitHub地址)——以ABP为基础架构的一个中等规模的OA开发日志

    前言: 最近园子里ABP炒的火热.看了几篇对于ABP的介绍后,深感其设计精巧,实现优雅.个人感觉,ABP或ABP衍生品的架构设计,未来会成为中型Net项目的首选架构模式.如果您还不了解ABP是什么,有 ...

  7. eclipse-mvn打包跳过junit测试类

    修改pom.xml,在build选项加上plugins的这段如下: <build> ..... <plugins> <plugin> <groupId> ...

  8. Leetcode 86. Unique Binary Search Trees

    本题利用BST的特性来用DP求解.由于BST的性质,所以root左子树的node全部<root.而右子树的node全部>root. 左子树 = [1, j-1], root = j, 右子 ...

  9. 订阅Linux内核的邮件列表

    1.发送订阅邮件 注意:一定不要使用像Foxmail这样的第三方邮件客户端,因为发送的邮件会转码,导致订阅不成功,推荐使用Gmail,直接登录进去发送. 发送邮件内容: 接收人:majordomo@v ...

  10. 代理IP收集

    做系统攻击和防守时都有用! http://www.xicidaili.com/ http://www.data5u.com/ http://ip.zdaye.com/ http://www.youda ...