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. SQL2008R2 不支持用该后端版本设计数据库关系图或表

    向下不兼容. 要么安装SQL2012,要么把SQL2012数据库通过脚本转成2008

  2. Spring学习进阶(二)Spring IoC

    在使用Spring所提供的各种丰富而神奇的功能之前,必须在Spring IoC容器中装配好Bean,并建立Bean与Bean之间的关联关系.控制反转(Inverser of Control ioc)是 ...

  3. 1025关于explain的补充1

    https://segmentfault.com/q/1010000004195469 我的困惑 http://www.cnblogs.com/BeginMan/p/3754322.html 可以指定 ...

  4. you-get中文说明

    来源于:https://github.com/soimort/you-get/wiki/%E4%B8%AD%E6%96%87%E8%AF%B4%E6%98%8E You-Get 乃一小小哒命令行程序, ...

  5. Mybatis 异常: The content of elements must consist of well-formed character data or markup

    原因很简单:在ibatis的配置文件中不能出现小于号(>)     <delete id="deleteByPrimaryKey" parameterType=&quo ...

  6. java.net.URLConnectioin的http(get,post)请求(原生)

    使用Java发送这两种请求的代码大同小异,只是一些参数设置的不同.步骤如下: 通过统一资源定位器(java.net.URL)获取连接器(java.net.URLConnection) 设置请求的参数 ...

  7. Spring Assert 断言

    Assert(断言)的初步理解构思 Web 应用在接受表单提交的数据后都需要对其进行合法性检查,如果表单数据不合法,请求将被驳回.类似的,当我们在编写类的方法时,也常常需要对方法入参进行合 法性检查, ...

  8. C#-WinForm-打开其他窗体的三种方式-Show()、设置Owner()、ShowDialog()

    打开其他窗体的三种方式 Show - 例如登入界面进入主页面,直接将主页面展示出来,两个窗体互不影响 public partial class Form1 : Form { public Form1( ...

  9. 系统间通信(10)——RPC的基本概念

    1.概述 经过了详细的信息格式.网络IO模型的讲解,并且通过JAVA RMI的讲解进行了预热.从这篇文章开始我们将进入这个系列博文的另一个重点知识体系的讲解:RPC.在后续的几篇文章中,我们首先讲解R ...

  10. Fiddler Post Debug

    Content-Type: application/json; charset="UTF-8"