申请博客有一段时间了,一直没有写些什么,今天写一下被遗忘的 xml,因为 ios 现在一般都用 JSON,但毕竟还有一部分老一些的服务器还会有 xml

  xml 格式的解析方式有两种

    1.SAX解析: IOS 默认的解析方式,速度快,因为他是一行一行的读所以内存占用较小,只读. (因为一开始手机的内存是很小的,所以 ios 默认用 sax)

    SAX 逆序列化是苹果提供的类NSXMLParser  代码如下:

      创建了一个 xml 叫 test

<person><man ids="1"><name>ZhangSan</name><height>185</height></man><man ids="2"><name>LiSi</name><height>156</height></man></person>

      创建这个 xml 的模型类叫 testXMLModel 继承于 NSObject 在 .h 文件中定义属性

    

 @property (strong,nonatomic)NSNumber *ids;
@property (copy,nonatomic)NSString *name;
@property (copy,nonatomic)NSNumber *height;

      testXMLModel.m 文件中

-(NSString *)description{
return [NSString stringWithFormat:@"%@ {ids = %@,name = %@,height = %@}",[super description],self.ids,self.name,self.height];
}
// kvc 找不到对应 key 则不处理
- (void)setValue:(id)value forUndefinedKey:(NSString *)key { }

我在 ViewController.m 中解析 代码如下

      

#import "ViewController.h"
#import "testXMLModel.h" @interface ViewController ()<NSXMLParserDelegate>
// 集合
@property (strong,nonatomic)NSMutableArray *manListArr;
// 用于拼接字符串
@property (copy,nonatomic)NSMutableString *currentString;
// 模型对象
@property (strong,nonatomic)testXMLModel *XMLModel;
@end @implementation ViewController - (NSMutableArray *)manListArr {
if (!_manListArr) {
_manListArr = [NSMutableArray array];
}
return _manListArr;
} - (NSMutableString *)currentString {
if (!_currentString) {
_currentString = [NSMutableString string];
}
return _currentString;
} - (void)viewDidLoad {
[super viewDidLoad]; // 获取 xml
NSData *data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"test.xml" ofType:nil]]; // 创建解析器
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data]; // 设置代理
parser.delegate = self; // 手动开启 parse
[parser parse]; }
#pragma mark - 文档出错
-(void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError{
NSLog(@"%@",parseError);
}
#pragma mark - 文档开始
-(void)parserDidStartDocument:(NSXMLParser *)parser{
NSLog(@"文档开始");
} #pragma mark - 开始读取元素
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict{ if([elementName isEqualToString:@"man"]){
//建立man对象
self.XMLModel = [[testXMLModel alloc] init];
// 获取 ids
self.XMLModel.ids = @(attributeDict[@"ids"].intValue); // 添加到集合
[self.manListArr addObject:self.XMLModel];
}
} #pragma mark - 文本
// 多次解析
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
// 拼接字符串
[self.currentString appendString:string];
} #pragma mark - 元素完成
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{ // KVC 赋值
[self. XMLModel setValue:self.currentString forKey:elementName]; // 每次赋值完成需要清空string
self.currentString.string = @""; }
#pragma mark - 文档结束
-(void)parserDidEndDocument:(NSXMLParser *)parser{
NSLog(@"文档结束"); NSLog(@"%@",self.manListArr.copy );
}

    

解析完成

    2.DOM解析:mac 默认的解析方式, iOS是无法直接使用的,他是整个一起全部读出来所以解析过程中内存占用大,支持读写(现在手机的内存已不是当年可比,所以一般小的数据iOS 也可以用这种解析方式)

      由于 DOM 解析是IOS 无法直接使用的 所以我们要先导入第三方框架GDataXMLNode

      首先配置文件

图好大 大家将就看 不好意思了 xml 和模型还用之前那两个

ViewController 代码如下

#import "ViewController.h"
#import "testXMLModel.h"
#import "GDataXMLNode.h" @interface ViewController ()
// 模型对象
@property (strong,nonatomic)testXMLModel *XMLModel;
@end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; // 获取 xml
NSData *data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"test.xml" ofType:nil]]; //集合
NSMutableArray *manListArr = [NSMutableArray array];
//dom解析
//1.加载文档
GDataXMLDocument *documennt = [[GDataXMLDocument alloc] initWithData:data error:NULL];
//根节点person
GDataXMLElement *videosElement = documennt.rootElement; //要获取man
for (GDataXMLElement *videoElement in videosElement.children) { testXMLModel *XMLModel = [[testXMLModel alloc] init]; [manListArr addObject:XMLModel]; //1.需要得到man的所有子标签
for (GDataXMLElement *baseElement in videoElement.children) {
//标签名字
NSString *name = baseElement.name;
NSString *value = baseElement.stringValue;
//kvc
[XMLModel setValue:value forKey:name];
} //2.得到man的所有属性
for (GDataXMLNode *attr in videoElement.attributes) {
NSString *name = attr.name;
NSString *value = attr.stringValue;
//kvc
[XMLModel setValue:value forKey:name];
}
}
NSLog(@"%@",manListArr.copy);

这种方式是很简便的把,  需要注意的是数据大的时候慎用,毕竟还是挺耗内存的..

XML 解析的两种方法的更多相关文章

  1. python实现XML解析的三种方法

    python实现XML解析的三种方法 三种方法:一是xml.dom.*模块,它是W3C DOM API的实现,若需要处理DOM API则该模块很适合:二是xml.sax.*模块,它是SAX API的实 ...

  2. .net中创建xml文件的两种方法

    .net中创建xml文件的两种方法 方法1:根据xml结构一步一步构建xml文档,保存文件(动态方式) 方法2:直接加载xml结构,保存文件(固定方式) 方法1:动态创建xml文档 根据传递的值,构建 ...

  3. XML解析的二种方法之dom解析

    XML解析的二种方法:dom解析和sax解析 文件大小      存储位置          读取速度 dom解析     小文件      放在内存中              快 sax解析   ...

  4. PHP中的XML解析的5种方法

    [前言]不管是桌面软件开发,还是WEB应用,XML无处不在!然而在平时的工作中,仅仅是使用一些已经封装好的类对XML对于处理,包括生成,解析等.假期有空,于是将PHP中的几种XML解析方法总结如下: ...

  5. JSON 解析的两种方法

    今天帮朋友看了下JSON解析结果············· eval解析JSON中的注意点 在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式: 1.一种为使用eval()函数. 2. ...

  6. java生成解析xml的另外两种方法Xstream

    Xstream生成和解析xm和JAXB生成和解析xml的方法. 一,Xstream Xstream非jdk自带的,需要到入Xstream-1.4.3.jar和xpp3_min-1.1.4.jar 1. ...

  7. java生成解析xml的另外两种方法JAXB

     JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术.该过程中,JAXB也提供了将XML实例文档反 ...

  8. XML解析的四种方法 建议使用demo4j解析 测试可以用

    https://www.cnblogs.com/longqingyang/p/5577937.html 4.DOM4J解析  特征: 1.JDOM的一种智能分支,它合并了许多超出基本XML文档表示的功 ...

  9. XML解析的二种方法之Sax解析

    package com.huawei.xml; import java.io.InputStream;import java.util.Stack; import javax.xml.parsers. ...

随机推荐

  1. H5 边框:带border的百分比布局

    响应式Web设计经常需要我们通过百分比设置组件宽度.如果我们不考虑边框,那么很容易就可以实现,但如果你给每一列以及总宽度都采用百分比设置,那这个时候固定的边框大小就会出来捣乱.下面我们将看到一组方法去 ...

  2. FPGA基础知识1

    1.乘法 在FPGA中,乘法运算可以分为 1)信号与信号之间的运算,用乘法器核实现: 2)常数与信号之间的运算,利用移位及加减法实现. A x 16 = A左移4位: A x 20 = A x 16  ...

  3. linux之master和minion

    saltstack博客地址: https://www.cnblogs.com/pyyu/p/9465608.html在线yaml文件编写:http://www.bejson.com/validator ...

  4. 【转】chrome devtools protocol——Web 性能自动化

    前言 在测试Web页面加载时间时,可能会是这样的: 打开chrome浏览器. 按F12打开开发者工具. 在浏览器上打开要测试的页面 查看开发者工具中Network面板的页面性能数据并记录 或者在开发者 ...

  5. Android 性能测试之内存 --- 追加腾讯性能案例,安卓抓取性能扫盲帖

    内存测试: 思路 目前做的是酒店APP,另下载安装几个个第三方酒店的APP以方便对比(相当于可以做竞品测试) 数据的获取来源是ADB底层命令,而且最好是不需要root权限,因为很多手机root很麻烦或 ...

  6. Ionic3错误: StaticInjectorError[HttpModule]: NullInjectorError: No provider for HttpModule!

    先在app.module.ts中导入HttpModule,才能在构造函数中注入Http. Ionic自动构建项目时,并没有导入HttpModule. 解决方案:打开app.module.ts,加入导入 ...

  7. ubuntu下安装php

    一.下载PHP7的最新版源码 php7.0.9 下载地址 http://php.net/get/php-7.0.9.tar.gz/from/a/mirror 二.解压 tar -zxf /tmp/ph ...

  8. Struts框架的数据封装二之模型驱动方式

    Struts2中提供了两类数据封装的方式? * 第二种方式:模型驱动 > 使用模型驱动的方式,也可以把表单中的数据直接封装到一个JavaBean的对象中,并且表单的写法和之前的写法没有区别! & ...

  9. opencv 3.2 vs2015 debug assertion __acrt_first_block == header

    网上复制了一个转直方图的代码 ,说来也奇怪, 用imshow 显示 图片在独立窗体内,不存在问题, 要注释掉这段代码就出现了下边的错误. 网上查了查,原来是程序中 有个std::vector<c ...

  10. Oracle_SQL(3) DML增删改

    sql语言按功能分为:数据定义语言DDL.数据操纵语言DML.数据查询语言DQL.数据控制语言DCL 一.数据操纵语言DML1.insert 新增 语法:insert into <表名> ...