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. 51单片机中断interrupt……using……

    51单片机中断细节的一些问题. interrupt0:外部中断0interrupt1:定时器中断0interrupt2:外部中断interrupt3:定时器中断1interrupt4:串口 using ...

  2. Java 自动装箱与拆箱(Autoboxing and unboxing)

    什么是自动装箱拆箱 基本数据类型的自动装箱(autoboxing).拆箱(unboxing)是自J2SE 5.0开始提供的功能. 一般我们要创建一个类的对象实例的时候,我们会这样: Class a = ...

  3. P值,“差异具有显著性”和“具有显著差异”

      P值是论文中最常用的一个统计学指标,可是其误用.解释错误的现象却很常见.因此,很有必要说明p值的意义.用法及常见错误.   P值指的是比较的两者的差别是由机遇所致的可能性大小.P值越小,越有理由认 ...

  4. 网站flash黑屏问题

    操作系统 专业回答 2012-04-12 20:44 看网站视频时,可以小屏看,不能最大化.最大化的时候,只有声音,图象卡住了不动. 解决办法: 1 打开视频 然后最大化 按键 击右健 设置 把加速硬 ...

  5. 59-chown 简明笔记

    改变文件的所有者或与文件相关联的组 chown [options] owner file-list chown [options] owner: group file-list chown [opti ...

  6. yii2权限控制rbac之详细操作步骤

    本篇的主题是 rbac权限控制的详细操作步骤,注意是操作步骤哦,关于配置与rbac的搭建,我们在博文 yii2搭建完美后台并实现rbac权限控制实例教程说的再清楚不过了. 但是,在很多人的反馈下,说是 ...

  7. 页面切换语言包使用session不用cookie

    cookie的问题,ifame中的cookie不一致 在父页面设置的语言包cookie,在iframe中获取不到.为什么呢? 为什么语言包这个事跟cookie过不去,有什么特殊的? iframe的sr ...

  8. 使用delegate实现简单的查询功能

    protected void imgbtnSearch_Click(object sender, System.Web.UI.ImageClickEventArgs e) { string keyWo ...

  9. Tomcat6查看数据库的数据源信息

    打开tomcat6\conf  下的 context.xml

  10. “Ceph浅析”系列之一——前言

    开源技术专家章宇同学(@一棹凌烟)在C3沙龙分享过Ceph之后,最近来了劲头,一口气写了一系列<Ceph浅析>的博文,共8篇: "Ceph浅析"系列之一--前言 &qu ...