1、XML解析(SAX)

NSXMLParser SAX 大文件

1)打开文档

- (void)parserDidStartDocument:(NSXMLParser *)parser

2)开始查找起始标签

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict

开始元素 : elementName
元素属性 : attributeDict

3)获取标签内容

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 

获取内容 : string

4)查找结束标签

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName

结束元素 : elementName namespaceURI 和 qName 为空值

5)关闭文档(查询结束)


- (void)parserDidEndDocument:(NSXMLParser *)parser

实现原理:

  • 1.在查找起始标签的时候,判断elementName是否与对应的字符串相等,并将接收到的内容删除

  • 2.因为获取内容的时候会出现获取两次 则使用追加方法,防止多次执行获取内容的方法 string + @“ "

  • 3.在查找结束标签的时候,判断elementName是否与对应的字符串相等,并将获取的模型加载到可变数组中,作为数据源,进行其他操作,再判断是否与对应的字符串不相等,利用kvc将对应的结束标签作为KEY值,对应获取的内容作为value值

//
// ViewController.m
//
//
// Created by peng on 16/2/19.
// Copyright (c) 2016年 pss. All rights reserved.
// #import "ViewController.h"
#import "PSSTrainInfo.h" static NSString *identifier = @"cellID"; @interface ViewController ()<UITableViewDataSource, UITableViewDelegate, NSXMLParserDelegate> @property (nonatomic, strong) UITableView *tableView; @property (nonatomic, strong) NSMutableArray *dataList; @property (nonatomic, strong) PSSTrainInfo *model; @property (nonatomic, strong) NSMutableString *muString; @end @implementation ViewController - (UITableView *)tableView { if (!_tableView) {
_tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain]; _tableView.delegate = self;
_tableView.dataSource = self; }
return _tableView;
} - (NSMutableString *)muString { if (!_muString) {
_muString = [NSMutableString string];
}
return _muString;
} - (NSMutableArray *)dataList { if (!_dataList) {
_dataList = [NSMutableArray array];
}
return _dataList;
} - (PSSTrainInfo *)model { if (!_model) {
_model = [[PSSTrainInfo alloc] init];
}
return _model;
} - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.dataList.count;
} - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier]; if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:identifier];
} return cell;
} - (void)parserDidStartDocument:(NSXMLParser *)parser { NSLog(@"开始解析"); } - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict { NSLog(@"起始元素:%@", elementName); if ([elementName isEqualToString:@"trainDetailInfo"]) { [self.model setValuesForKeysWithDictionary:attributeDict]; }
self.muString = nil;
} - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { NSLog(@"内容:%@", string); [self.muString appendString:string]; } - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { NSLog(@"结束元素:%@", elementName); if ([elementName isEqualToString:@"trainDetailInfo"]) { [self.dataList addObject:self.model]; }else if (![elementName isEqualToString:@"dataSet"] && ![elementName isEqualToString:@"diffgr:diffgram"]) { [self.model setValue:self.muString forKey:elementName]; } } - (void)parserDidEndDocument:(NSXMLParser *)parser { NSLog(@"结束解析"); [self.tableView reloadData]; NSLog(@"%@",self.dataList); } - (void)viewDidLoad
{
[super viewDidLoad]; NSURL *url = [NSURL URLWithString:@"http://192.168.1.2/train.xml"]; NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:15]; [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) { NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data]; parser.delegate = self; [parser parse]; }]; [self.view addSubview:self.tableView]; }
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} @end

iOS 中的XML解析代码(SAX)的更多相关文章

  1. iOS 中的 xml 解析

    在ios 中解析xml 的方法有很多种 1.苹果原生 NSXMLParser:SAX方式解析,使用简单 2.第三方框架 libxml2:纯c语言,默认包含在ios  sdk中,同时支持DOM 和 SA ...

  2. IOS中的XML解析之DOM和SAX

    一.介绍 dom是w3c指定的一套规范标准,核心是按树形结构处理数据,dom解析器读入xml文件并在内存中建立一个结构一模一样的“树”,这树各节点和xml各标记对应,通过操纵此“树”来处理xml中的文 ...

  3. iOS - - JSON 和 XML解析

    JSON 和 XML 一.JSON 1.什么是JSON JSON是一种轻量级的数据格式,一般用于数据交互 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) 2.JSON的格 ...

  4. XML解析(二) SAX解析

    XML解析之SAX解析: SAX解析器:SAXParser类同DOM一样也在javax.xml.parsers包下,此类的实例可以从 SAXParserFactory.newSAXParser() 方 ...

  5. XML解析之SAX详解

    XML解析之SAX详解 本文属于作者原创 http://www.cnblogs.com/ldnh/ XML解析的五个步骤 1.打开文档 (void)parserDidStartDocument:(NS ...

  6. ios之json,xml解析

    JSON解析步骤: 1.获取json文件路径 NSString*path = [[NSBundle mainBundle] pathForResource:@"Teacher"of ...

  7. 解决在php5中simple XML解析错误的问题

    2004年7月,php5正式版本的发布,标志着一个全新的PHP时代的到来.PHP5的最大特点是引入了面向对象的全部机制,并且保留了向下的兼容性.程序员不必再编写缺乏功能性的类,并且能够以多种方法实现类 ...

  8. iOS中UIWebView执行JS代码(UIWebView)

    iOS中UIWebView执行JS代码(UIWebView) 有时候iOS开发过程中使用 UIWebView 经常需要加载网页,但是网页中有很多明显的标记让人一眼就能看出来是加载的网页,而我们又不想被 ...

  9. iOS边练边学--iOS中的XML数据解析

    XML的解析方式 SAX 大小文件都可以 NSXMLParser DOM 最好是小文件 GDataXML NSXMLParser的用法 创建解析器来解析 // 创建XML解析器 NSXMLParser ...

随机推荐

  1. ASP.NET的分页方法(二)

    第二讲主要使用到了常用的分页控件aspnetpager,这里对他就行一个简单的应用,具体大家可以到杨涛的博客上去寻找相关的DLL, 首先要先引用AspNetPager.dll,然后把这个DLL同时添加 ...

  2. c#学习之旅------01

    一.交换两个数的值 //交换两个数的值 #region 方法一 , num2 = ;//待交换的两个数值 int temp;//临时变量 temp = num1; num1 = num2; num2 ...

  3. android 简易时间轴(实质是ListView)

    ListView的应用 1.在很多时候是要用到时间轴的,有些处理的时间轴比较复杂,这里就给出一个比较简单的时间轴,其实就是ListView里面的Item的设计. 直接上代码: ListView,ite ...

  4. ReentrantLock

    与synchronized相同并发性和内存语义. [新增特性]锁投票.定时锁等候.可中断锁等候.更少时间调度线程. [用法注意点]Lock必须在finally块中释放. Lock lock = new ...

  5. hibernate的配置文件

  6. cocos2d-x android java调用C++

    转自:http://www.cnblogs.com/mokey/archive/2013/04/10/3012961.html java调用C++ 1.在jniHelper.java文件中定义一个方法 ...

  7. apache2 添加perl支持

    官方文档,很详细了. https://httpd.apache.org/docs/2.0/howto/cgi.html#configuring   我修改了/etc/apache2/sites-ava ...

  8. Trapping Messages Sent to an Application

    http://www.delphicorner.f9.co.uk/articles/apps7.htm Trapping Messages Sent to an Application I wrote ...

  9. SCCM 2012系列之新特性

    SCCM 2012站点类型: 站点 作用 相对于SCCM 2007 的变化 中心管理站点The central administration site(CAS) 中心管理站点协调内部站点的数据复制.使 ...

  10. Codeforces Round #338 (Div. 2) D. Multipliers 数论

    D. Multipliers 题目连接: http://codeforces.com/contest/615/problem/D Description Ayrat has number n, rep ...