NSXMLParser解析本地.xml数据(由于like7xiaoben写的太好了,我从她那里粘贴过来的)
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写的太好了,我从她那里粘贴过来的)的更多相关文章
- Android 通过Dom, Sax, Pull解析网络xml数据
这篇文章不是完全原创,XML解析的部分参考了 liuhe688 的文章.文章地址:http://blog.csdn.net/liuhe688/article/details/6415593 这是一个几 ...
- [javascript]—jQuery解析本地 XML 文档
Create a jQuery object using an XML string and obtain the value of the title node. <!doctype html ...
- iOS 详解NSXMLParser方法解析XML数据方法
前一篇文章已经介绍了如何通过URL从网络上获取xml数据.下面介绍如何将获取到的数据进行解析. 下面先看看xml的数据格式吧! <?xml version="1.0" enc ...
- XML数据 JSON数据 LitJSON 数据 的编写和解析 小结
用XML生成如下数据<?xml version="1.0"encoding="UTF-8"?><Transform name="My ...
- iOS开发——网络Swift篇&JSON与XML数据解析
JSON与XML数据解析 JSON数据解析(内置NSJSONSerialization与第三方JSONKit) 一,使用自带的NSJSONSerialization 苹果从IOS5.0后推出了SD ...
- 如何解析本地和线上XML文件获取相应的内容
一.使用Dom解析本地XML 1.本地XML文件为:test.xml <?xml version="1.0" encoding="UTF-8"?> ...
- xml数据解析和生成
java中xml的解析方式有许多,有java自带的DOM.SAX,android中的PULL,其它的还有DOM4J.JDOM等. 本文简要讲述DOM.SAX.PULL三种方式. 1.DOM方法 缺点: ...
- iOS - XML 数据解析
前言 @interface NSXMLParser : NSObject public class NSXMLParser : NSObject 1.XML 数据 XML(Extensible Mar ...
- iOS解析XML数据
iOS中解析XML数据的类是 NSXMLParser,详细使用方法如下: 假设现在在内存中有XML的二进制数据对象(NSData):data(该数据可能来自网络,也可能是本地的文件数据),设置NSX ...
随机推荐
- shell note
1 输出重定向:ll > aaa 将输出内容 添加到aaa文件中 ll >> aaa将输出内容追加到aaa中 ll &>> abc 将输出内容不论正确或错误都保存 ...
- mysql的sql_mode合理设置
mysql的sql_mode合理设置 sql_mode是个很容易被忽视的变量,默认值是空值,在这种设置下是可以允许一些非法操作的,比如允许一些非法数据的插入.在生产环境必须将这个值设置为严格模式,所以 ...
- Linux开机后 systemd 自动启动 ceph osd mon进程
机房操作失误导致机架或主机掉电是偶尔发生的事情,那么怎么在这种情况下,让Ceph服务随OS启动而快速启动呢 ? 如下是一个简单方法: 在OSD主机上执行如下命令: sudo ln -s /usr/li ...
- Java设计模式(一) 策略模式
策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 1,定义算法接口 package com.pattern.strategy.test; publ ...
- Jquery-下拉列表设置默认选择
$('#select option:eq(2)').attr('selected','selected');
- sql 定义自增id插入数据
-- 定义一个自增变量 ; -- 执行自增语句 ,sponsorbroker,,, from stock_listing_detailed_info group by sponsorbroker;
- Fiddler+Jmeter+断言详细教程
一.Fiddler抓包工具的配置和使用 在编写网关自动化脚本之前,得先学会如何抓包,这里以Fiddler为例.会抓包的同学可以跳过这一步,当然看看也是没坏处的-- 局域网络配置 将要进行抓包的手机与电 ...
- datatable绑定comboBox显示数据[C#]
实现功能: datatable绑定comboBox,在下拉菜单中显示对应数据 实现方法: 1.生成datatable,并为combox绑定数据源: comboBox1.DataSource = dt1 ...
- 解决虚拟机 MAC10.9 不能设置1366*768分辨率问题
首先在虚拟机设置里,显示--3d下面--固定分辨率--最大设成1024*768--保存然后打开虚拟机的.vmx文件,最后几行 svga.autodetect = "FALSE"sv ...
- ORA-01157错误,丢失undo tablespace中数据文件的解决方法
我们先来看一下这个现象: [oracle@djp ora12]$ pwd /u01/app/oracle/oradata/ora12 [oracle@djp ora12]$ mv undotbs01. ...