XML解析一般分两种模式SAX和DOM,事件和文档。具体解析google去吧,有详细。不过看了下面的两个例子,一般就了解了。

一:XML解析之SAX解析,以及对NSXMLParser的应用。

  sax解析说白了,就是一个事物模型解析,从头开始读取文档然后根据读取到的头标签标签时要怎么处理,读完头标签后,理论上是读取标签值了,

  然后读取后遇到结束标签等

  SDK本身是提供了NSXMLParser解析器。

 1 -(BOOL)parser:(NSString*)string
 2 {
 3     //系统自带的
 4     NSXMLParser *par = [[[NSXMLParser alloc] initWithData:[string dataUsingEncoding:NSUTF8StringEncoding]]autorelease];
 5     //设置NSXMLParser对象的解析方法代理
 6     [par setDelegate:self];
 7     //调用代理解析NSXMLParser对象,看解析是否成功
 8     return [par parse];
 9 }
10
11 #pragma mark xmlparser
12 //step 1 :准备解析
13 - (void)parserDidStartDocument:(NSXMLParser *)parser
14 {
15 //    NSLog(@"%@",NSStringFromSelector(_cmd) );
16 }
17 //step 2:准备解析节点
18 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
19 {
20 //    NSLog(@"%@",NSStringFromSelector(_cmd) );
21 }
22 //step 3:获取首尾节点间内容
23 - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
24 {
25     NSLog(@"%@",NSStringFromSelector(_cmd) );
26 }
27
28 //step 4 :解析完当前节点
29 - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
30 {
31    NSLog(@"%@",NSStringFromSelector(_cmd) );
32 }
33
34 //step 5;解析结束
35 - (void)parserDidEndDocument:(NSXMLParser *)parser
36 {
37 //    NSLog(@"%@",NSStringFromSelector(_cmd) );
38 }
39 //获取cdata块数据
40 - (void)parser:(NSXMLParser *)parser foundCDATA:(NSData *)CDATABlock
41 {
42 //    NSLog(@"%@",NSStringFromSelector(_cmd) );
43 }

1.初始化解析器,传入你要解析的数据。

2.parse,启动解析,返回一个是否解析成功Bool值。

3.基本你要处理的就在下面实现的1-5个代理方法了。

其实代理方法和详细,就是一个事物进行流程:

step1是准备解析,然后没意外就是执行到了——>

step2读取到第一个头节点了,然后如果内部有属性值,你可以获取出来,读完头节点,我们会进去值域——>

step3对于简单的节点,可能直接就是一个string值了,但是看例子我们会知道,很多情况下,该节点的值域包含的于是一个节点——>

  这步其实分两种,如果是值,那么就是执行step4,获取值的字窜,如果是子节点呢,我们一看就知道,它又是进行了step2,

  即读取到头标签了,其实你是很人读一片文章流程一样,只不过我们脑中有个印象<xxx>是头标签了,我们要做什么,独到 头标签的最后一个符号">"

  下面进去值域,独到了字窜的话就调用了foundCharacters:(NSString *)string,如果又读到<xxx>这样的,那就又是头标签了。——>

step5就是读到开始尾标签符号了。

  最后一个方法

  foundCDATA:(NSData *)CDATABlock,其实也是一个格式

<content:encoded>
<![CDATA[
<img src="http://img1.douban.com/mpic/s10489201.jpg" style="float:right;margin-left:16px"/><a href="http://www.douban.com/people/maldini/">减卐肥™</a>评论: <a href="http://movie.douban.com/subject/6799191//">搜索</a><br/> <br/>评价: 力荐<br/><br/>
]]>
</content:encoded>

  好了,方法和流程大致了解了,拿一个我最近遇到的例子,好多时候,我们会遇到这样读取一组类似于json中数组形式的数据

<channel>
<title>我是标题</title>
<link>http://write.blog.csdn.net/postedit</link>
<description>...</description>
<language>zh-cn</language>
<pubDate>Fri, 03 Aug 2012 06:20:31 GMT</pubDate>
<item>...</item>
<item>...</item>
<item>...</item>
<item>...</item>
<item>...</item>
<item>...</item>
<item>...</item>
<item>...</item>
<item>...</item>
<item>...</item>
<item>...</item>
<item>...</item>
<item>...</item>
<item>...</item>
<item>...</item>
<item>...</item>
<item>...</item>
<item>...</item>
<item>...</item>
<item>...</item>
</channel> 

一般来说,我们要的数据其实都是这20个item,对吧,每个item下都是相同的3个标签,title,author,time。形式上
其实一种数组形式
那么要怎么解析呢
1,首先我们可能先申明一个array数组容器用来存放这个20个对象,然后每个item对象中又有3个元素,那么我们可以
考虑用一个字典数据结构来表示每个item。
2.需要至少申请两个空间来作为类似于“哨兵”存储当前执行到的节点名,以及节点的值。
3.然后每次执行到读取到item时,初始化我们上面说道的一个字典数据结构。
4.在foundCharacters:方法中一直保存当前最新的值(当然,这里面其实会有个小瑕疵,下面会说到)。
5.在标签结束的方法,我们把标签名和值已键值对存入上面初始化的字典容器中。
 1 #pragma mark xmlparser
 2 //step 1 :准备解析
 3 - (void)parserDidStartDocument:(NSXMLParser *)parser
 4 {
 5 //    NSLog(@"%@",NSStringFromSelector(_cmd) );
 6
 7     parserObjects = [[NSMutableArray alloc]init];
 8 }
 9 //step 2:准备解析节点
10 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
11 {
12 //    NSLog(@"%@",NSStringFromSelector(_cmd) );
13
14     self.currentText = [[NSMutableString alloc]init];
15     [currentText release];
16     if ([elementName isEqualToString:@"item"]) {
17         NSMutableDictionary *newNode = [[ NSMutableDictionary alloc ] initWithCapacity : 0 ];
18         twitterDic = newNode;
19         [parserObjects addObject :newNode];
20         [newNode release];
21     }
22     else if(twitterDic) {
23         NSMutableString *string = [[ NSMutableString alloc ] initWithCapacity : 0 ];
24         [twitterDic setObject :string forKey :elementName];
25         [string release ];
26         currentElementName = elementName;
27     }
28
29
30 }
31 //step 3:获取首尾节点间内容
32 - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
33 {
34     NSLog(@"%@",NSStringFromSelector(_cmd) );
35     [currentText appendString:string];
36 }
37
38 //step 4 :解析完当前节点
39 - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
40 {
41     if ([elementName isEqualToString:@"item"]) {
42         twitterDic = nil;
43     }else
44         if ([elementName isEqualToString:currentElementName]) {
45
46             if ([elementName isEqualToString:@"description"]
47                 ||[elementName isEqualToString:@"content:encoded"]) {
48                 [twitterDic setObject:Cdata forKey:currentElementName];
49             }else {
50                 [twitterDic setObject:currentText forKey:currentElementName];
51             }
52     }
53
54 }
55
56 //step 5;解析结束
57 - (void)parserDidEndDocument:(NSXMLParser *)parser
58 {
59 }
60 //获取cdata块数据
61 - (void)parser:(NSXMLParser *)parser foundCDATA:(NSData *)CDATABlock
62 {
63     Cdata =[[NSString alloc] initWithData:CDATABlock encoding:NSUTF8StringEncoding];
64 }

二:Dom文档解析模型,TBXML第三方包应用。
dom解析模型就像一个树结构,节点,子节点,兄弟节点等等。
这个其实最后被我抛弃了,这个解析器太简化了,太简洁的东西导致控制的入口点太少,就比如一个一键优化的软件的概念是一样的,一键清楚缓存,优化配置,文件归类等等。人为控制就少了,导致我解析上面那个模型时,只知道遍历存储~。但是这个解析期对部分要求不高的xml解析其实挺好分,真的很简洁。
 1 - (void)recurrence:(TBXMLElement *)element {
 2
 3     NSString *eleName = [TBXML elementName:element];
 4     NSString *eleText = [TBXML textForElement:element];
 5     if ([eleName isEqualToString:@"item"]) {
 6         self recurrence:element
 7     }
 8     do {
 9
10         NSString *eleName = [TBXML elementName:element];
11         NSString *eleText = [TBXML textForElement:element];
12
13         //递归处理子树
14         if (element->firstChild) {
15             NSLog(@"<%@>:",eleName);// Display the name of the element
16
17             [self recurrence:element->firstChild];
18         }else {
19             NSLog(@"<%@>:%@",eleName,eleText);// Display the name of the element
20
21             TBXMLElement *parent = element->parentElement;
22             if ([[TBXML elementName:parent] isEqualToString:@"item"]) {
23                 NLRssInfo *info = [[[NLRssInfo alloc]init] autorelease];
24
25                 if ([eleName isEqualToString:@"title"]) {
26                     info.title = eleText;
27                 }
28
29                 [dataArr addObject:info];
30             }
31
32         }
33
34         //迭代处理兄弟树
35     } while ((element = element->nextSibling));
36 }
37
38 - (void) dealloc
39 {
40     [title release];
41     [subtitle release];
42     [super dealloc];
43 }

递归遍历,常规的树操作,具体内容可以网上搜搜,很多。
并且开源库的好处就是有源代码,也就3个类,6个文件,有兴趣可以研究研究,貌似大部分代码是用C写的。

转载于:https://www.cnblogs.com/tryingx/articles/3715243.html

网络数据的XML解析相关推荐

  1. 列举网络爬虫所用到的网络数据包,解析包?

    网络数据包 urllib.urllib2.requests 解析包 re.xpath.beautiful soup.lxml 转载于:https://www.cnblogs.com/sea-strea ...

  2. AndroidStudio请求网络数据,把解析出来的数据放在listview里

    有网的效果图 无网效果图 MainActivity里面的代码 package com.qy.day02;import android.support.v7.app.AppCompatActivity; ...

  3. 数据对接利用hutool工具类进行xml解析,xml转换成map,然后进行数据入库

    数据对接xml解析 <ESBEntry><!--通过MB对请求进行权限验证,验证后将删除AccessControl节点 --><AccessControl>< ...

  4. OC中JSON解析与XML解析

    文章目录 ###JSON JSON是一种轻量级的数据格式,一般用于数据交互: 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外). JSON的格式很像OC中的字典和数组,标准 ...

  5. 【php毕业设计】基于php+mysql+apache的网络数据包分析工具设计与实现(毕业论文+程序源码)——网络数据包分析工具

    基于php+mysql+apache的网络数据包分析工具设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于php+mysql+apache的网络数据包分析工具设计与实现,文章末尾附有本毕业设 ...

  6. ios网络学习------8 xml格式数据的请求处理 用代码块封装

    #pragma mark 载入xml - (void)loadXML {//获取网络数据.NSLog(@"load xml");//从webserver载入数据NSString * ...

  7. 数据解析1:XML解析(1)

    Http网络传输中的数据组织格式主要有三种: 1.HTML方式 2.XML方式 3.JSON方式 其中XML方式的数据解析有三种:DOM解析,SAX解析,Pull解析. 下面主要讲解SAX解析. 因为 ...

  8. iOS之网络数据下载和JSON解析

    iOS之网络数据下载和JSON解析 简介 在本文中笔者将要给大家介绍iOS中如何利用NSURLConnection从网络上下载数据, 如何解析下载下来的JSON数据格式, 以及如何显示数据和图片的异步 ...

  9. Android网络数据JSON解析使用总结

    一.JSON基础知识 (一)什么是json JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 易于人阅读和编写.同时也易于机器解析和生成. 它基于Java ...

最新文章

  1. pandas使用groupby函数计算dataframe数据中每个分组的滚动统计值(rolling statistics)的语法:例如分组的N天滚动平均值、滚动中位数、滚动最大最小值、滚动加和等
  2. 设计模式原则之依赖倒置原则
  3. Java:使用Toxiproxy模拟各种连接问题
  4. php times33,PHP Hash算法:Times33算法代码实例
  5. 求向量的垂线_高考数学填空题如何快速求直线关于直线对称的直线方程
  6. Linux (转)解析 xinetd.conf
  7. oneno浏览器插件_Send to OneNote 1.2.13
  8. 区块链核心技术演进之路-共识机制演进
  9. java 判断数字是否连续,JAVA 判断是否连续字母或者数字
  10. Win 10.0.16299.15 禁用五笔输入法Shift切换中英文
  11. 对于计算机了解的知识,学电脑应该了解哪些基本知识
  12. 软件工程师是青春饭吗?
  13. 知识众筹第9期 一个经典案例学会数据分析 | 开始分红报名
  14. 剖析拒绝服务攻击-SYN拒绝服务(转)
  15. PDF如何修改文件字体大小
  16. JavaScript自定义tirm方法
  17. 你也可以找到好工作(一)
  18. 我与MVVM的恩怨情仇
  19. cnpm报错 : 无法加载文件 C:\Users\Administrator\AppData\Roaming\npm\cnpm.ps1,因为在此系统上禁止运行脚本
  20. Source Insight 4.0安装

热门文章

  1. c语言关键字-static
  2. mybatis添加记录时返回主键id
  3. springboot . 配置jpa使用
  4. python笔记-列表和元组
  5. create-react-app 脚手架构建项目,搬砖过程中持续总结心得
  6. STL标准库六大组件
  7. 嵌入式软硬件开发中遇到的坑
  8. linux下OpenSSL的RSA密钥生成
  9. 欢庆1024之:程序猿不是你想黑,想黑就能黑!
  10. centos 7 安装docker 并设置阿里云镜像仓库