1、XML解析(SAX)

NSXMLParser SAX 大文件

1)打开文档

  1. - (void)parserDidStartDocument:(NSXMLParser *)parser

2)开始查找起始标签

  1. - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict
  2. 开始元素 : elementName
  3. 元素属性 : attributeDict

3)获取标签内容

  1. - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
  2. 获取内容 : string

4)查找结束标签

  1. - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
  2. 结束元素 : elementName namespaceURI qName 为空值

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


  1. - (void)parserDidEndDocument:(NSXMLParser *)parser

实现原理:

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

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

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

  1. //
  2. // ViewController.m
  3. //
  4. //
  5. // Created by peng on 16/2/19.
  6. // Copyright (c) 2016年 pss. All rights reserved.
  7. //
  8. #import "ViewController.h"
  9. #import "PSSTrainInfo.h"
  10. static NSString *identifier = @"cellID";
  11. @interface ViewController ()<UITableViewDataSource, UITableViewDelegate, NSXMLParserDelegate>
  12. @property (nonatomic, strong) UITableView *tableView;
  13. @property (nonatomic, strong) NSMutableArray *dataList;
  14. @property (nonatomic, strong) PSSTrainInfo *model;
  15. @property (nonatomic, strong) NSMutableString *muString;
  16. @end
  17. @implementation ViewController
  18. - (UITableView *)tableView {
  19. if (!_tableView) {
  20. _tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
  21. _tableView.delegate = self;
  22. _tableView.dataSource = self;
  23. }
  24. return _tableView;
  25. }
  26. - (NSMutableString *)muString {
  27. if (!_muString) {
  28. _muString = [NSMutableString string];
  29. }
  30. return _muString;
  31. }
  32. - (NSMutableArray *)dataList {
  33. if (!_dataList) {
  34. _dataList = [NSMutableArray array];
  35. }
  36. return _dataList;
  37. }
  38. - (PSSTrainInfo *)model {
  39. if (!_model) {
  40. _model = [[PSSTrainInfo alloc] init];
  41. }
  42. return _model;
  43. }
  44. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
  45. return self.dataList.count;
  46. }
  47. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  48. UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
  49. if (!cell) {
  50. cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:identifier];
  51. }
  52. return cell;
  53. }
  54. - (void)parserDidStartDocument:(NSXMLParser *)parser {
  55. NSLog(@"开始解析");
  56. }
  57. - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict {
  58. NSLog(@"起始元素:%@", elementName);
  59. if ([elementName isEqualToString:@"trainDetailInfo"]) {
  60. [self.model setValuesForKeysWithDictionary:attributeDict];
  61. }
  62. self.muString = nil;
  63. }
  64. - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
  65. NSLog(@"内容:%@", string);
  66. [self.muString appendString:string];
  67. }
  68. - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
  69. NSLog(@"结束元素:%@", elementName);
  70. if ([elementName isEqualToString:@"trainDetailInfo"]) {
  71. [self.dataList addObject:self.model];
  72. }else if (![elementName isEqualToString:@"dataSet"] && ![elementName isEqualToString:@"diffgr:diffgram"]) {
  73. [self.model setValue:self.muString forKey:elementName];
  74. }
  75. }
  76. - (void)parserDidEndDocument:(NSXMLParser *)parser {
  77. NSLog(@"结束解析");
  78. [self.tableView reloadData];
  79. NSLog(@"%@",self.dataList);
  80. }
  81. - (void)viewDidLoad
  82. {
  83. [super viewDidLoad];
  84. NSURL *url = [NSURL URLWithString:@"http://192.168.1.2/train.xml"];
  85. NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:15];
  86. [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
  87. NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
  88. parser.delegate = self;
  89. [parser parse];
  90. }];
  91. [self.view addSubview:self.tableView];
  92. }
  93. - (void)didReceiveMemoryWarning
  94. {
  95. [super didReceiveMemoryWarning];
  96. // Dispose of any resources that can be recreated.
  97. }
  98. @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. SQLCONNECTION使用HTTP通信协议和中间件连接

    SQLCONNECTION支持TCP/IP和HTTP两种通信协议和中间件连接.一般地,默认情况下使用TCP/IP协议. HTTP 协议的一个非常重要的优势在于穿越防火墙. SQLCONNECTION使 ...

  2. 几种连接不同数据库的ADO.NET字符串

    Data Source=myServerAddress;Initial Catalog=myDataBase;User Id=myUsername;Password=myPassword;或者 Ser ...

  3. HDU 5776 sum (前缀和)

    题意:给定 n 个数,和 m,问你是不是存在连续的数和是m的倍数. 析:考虑前缀和,如果有两个前缀和取模m相等,那么就是相等的,一定要注意,如果取模为0,就是真的,不要忘记了,我当时就没记得.... ...

  4. servlet-3_0-final-spec

    <?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns="http://w ...

  5. android获取手机的所有通讯录的号码和sim卡号码

    ============personer================================================ package com.qgc.cantent.entity; ...

  6. 【flash】关于flash的制作透明gif的一个小技巧

    关于flash的制作透明gif的一个小技巧 或者说是一个需要注意的地方 1.导出影片|gif,得到的肯定是不透明的.2.想要透明背景,必须通过发布.3.flash中想要发布gif动画的话,不能有文字, ...

  7. jquery 显示“加载状态 结束”

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. Eclipse配置PyDev插件

    安装python解释器 安装PyDev: 首先需要去Eclipse官网下载:http://www.eclipse.org/,Eclipse需要JDK支持,如果Eclipse无法正常运行,请到Java官 ...

  9. vim编码相关配置

    主要与三个参数有有关 fileencoding 缩写:fenc 保存文件时所用的编码 set fenc 查看当前文件的编码 set fenc=utf-8 可以将当前文件转换为utf-8编码 filee ...

  10. Java学习笔记(4)——JavaSE

    一.HashMap HashMap以键值对的形式存储对象,关键字Key是唯一的,不重复的 1,key可以是任何对象,Value可以任何对象 2,重复的key算一个,重复添加是替换操作(会覆盖原来的元素 ...