文档章节

XML的DOM、Sax解析

iOS赵师顺
 iOS赵师顺
发布于 2016/06/27 22:52
字数 765
阅读 24
收藏 0
点赞 0
评论 0

#import "Student.h"

#import "GDataXMLNode.h"

 

 

@interface ViewController ()<NSXMLParserDelegate>

{

    NSString *_recordElementName;

}

 

@property   (nonatomic,strong)NSMutableArray *XMLDomArray;

@property   (nonatomic,strong)NSMutableArray *XmlSAXArray;

 

@end

 

@implementation ViewController

- (void)viewDidLoad {

 [super viewDidLoad];

    

    // 注意使用

1、找到“Paths\Header Search Paths”项,并添加“/usr/include/libxml2”到列表中

2、找到“Linking\Other Linker Flags”项,并添加“-lxml2”到列表中

3、需要在Build Phases->CompileSorces ->双击GDataXMLNode.m,添加-fno-objc-arc

    [self XMLDom];

    [self XMLSax];

}

#pragma mark - XML的DOM解析

 

- (void)XMLDom{

    _XMLDomArray = [[NSMutableArray alloc]init];

    NSString *path = [[NSBundle mainBundle] pathForResource:@"Student" ofType:@"xml"];

    NSData *data = [NSData dataWithContentsOfFile:path];

    

    NSError *error = nil;

    GDataXMLDocument *document = [[GDataXMLDocument alloc]initWithData:data options:0 error:&error];

//    取出xml的根节点

    GDataXMLElement *root = document.rootElement;

//   取出xml根节点下的所有子节点

    NSArray *rootChile = root.children;

    

    for (GDataXMLElement *child in rootChile) {

        

        GDataXMLElement *nameElement = [[child elementsForName:@"name"]objectAtIndex:0];

        NSString *name = [nameElement stringValue];

        NSLog(@"%@",name);

        GDataXMLElement *ageElement = [[child elementsForName:@"age"]objectAtIndex:0];

        NSString *age = [ageElement stringValue];

        NSLog(@"%@",age);

        

    }

    

}

 

#pragma mark - XML的SAX解析

 

- (void)XMLSax{

    NSString *path = [[NSBundle mainBundle]pathForResource:@"Student" ofType:@".xml"];

    // 将数据转换成二进制的nsdata

    NSData *data = [NSData dataWithContentsOfFile:path];

    // 系统提供的一个雷用来解析nsdata

    NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];

    // 相关属性

    // 设置是否处理命名空间的(版权问题)

    [parser setShouldProcessNamespaces:NO];

    // 设置是否回报空间的处理结果

    [parser setShouldReportNamespacePrefixes:NO];

    

    parser.delegate = self;

    

    // 开始解析

    

    [parser parse];

    

    // 代理方法

    

}

 

#pragma mark-----打开文档

 

-(void)parserDidStartDocument:(NSXMLParser *)parser{

    // 打开文档只执行一次

    self.XmlSAXArray = [NSMutableArray array];

}

 

#pragma mark------打开标签

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

    // 在每次打开标签的时候,记录标签 在取值时用来判断

    

    _recordElementName = elementName;

    

    if ([_recordElementName isEqualToString:@"student"]) {

        Student *stu = [[Student alloc]init];

        [self.XmlSAXArray addObject:stu];

    }

    

}

 

#pragma mark-----取值

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

    

    // 每次都是先打开标签创建模型存入数组,在取值,每次去的都是最后一个值

    Student *stu = self.XmlSAXArray.lastObject;

    

    if ([_recordElementName isEqualToString:@"name"]) {

        stu.name = string;

    }

}

#pragma mark----关闭标签

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

    _recordElementName = nil;

    //XML的SAX解析方式是  打开标签——》取值——》关闭标签——》取值

    // 通过声明一个标签的实例变量 进行判断,防止将以前的数据覆盖

}

 

#pragma mark-----关闭文档

-(void)parserDidEndDocument:(NSXMLParser *)parser{

    

    for (Student *stu in self.XmlSAXArray) {

        NSLog(@"%@",stu);

    } 

}

 

#pragma mark - xml文档

<Students>

    

    <student>

        <name>张三</name>

    </student>

    

    <student>

        <name>李四</name>

    </student>

  #pragma mark-简历Student类

.h

#import <Foundation/Foundation.h>

@interface Student : NSObject

 

@property(nonatomic,copy)NSString *name;

@property(nonatomic,copy)NSString *sex;

@property(nonatomic,copy)NSString *age;

 

@end

  

    <student>

        <name>王二</name> 

    </student>

 

</Students>

 

 

© 著作权归作者所有

共有 人打赏支持
iOS赵师顺
粉丝 3
博文 73
码字总数 35628
作品 0
昌平
程序员
Android 创建与解析XML(一)—— 概述

Android 是最常用的智能手机平台,XML 是数据交换的标准媒介,Android 中可以使用标准的XML生成器、解析器、转换器 API,对 XML 进行解析和转换。 XML,相关有DOM、SAX、JDOM、DOM4J、Xerce...

长平狐 ⋅ 2013/01/06 ⋅ 0

Python_016 XML解析

XML 指可扩展标记语言(eXtensible Markup Language)。 XML 被设计用来传输和存储数据。 XML是一套定义语义标记的规则,这些标记将文档分成许多部件并对这些部件加以标识。 它也是元标记语言...

g00m ⋅ 2015/02/21 ⋅ 0

详解Java解析XML的四种方法

XML现在已经成为一种通用的数据交换格式,平台的无关性使得很多场合都需要用到XML。本文将详细介绍用Java解析XML的四种方法。 XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关...

hchen1982 ⋅ 2011/08/08 ⋅ 0

JAVA 中的四种解析XML方式

解析XML XML现在已经成为一种通用的数据交换格式,平台的无关性使得很多场合都需要用到XML。本文将详细介绍用Java解析 XML的四种方法。 XML现在已经成为一种通用的数据交换格式,它的平台无关性...

lee123lee ⋅ 2013/08/24 ⋅ 2

android xml解析的三种方式

在android开发中,经常用到去解析xml文件,常见的解析xml的方式有一下三种:SAX、Pull、Dom解析方式。最近做了一个android版的CSDN阅读器,用到了其中的两种(sax,pull),今天对android解析...

球球 ⋅ 2016/09/24 ⋅ 0

JAVA解析XML的方式DOM、SAX、DOM4J、JDOM、StAX之详解与比较

JAVA解析XML的方式DOM、SAX、DOM4J、JDOM、StAX之详解与比较 1.各种方式的详解 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的 官方W3C标准。DOM是以层次结构组织...

_xiaotudou ⋅ 2014/03/28 ⋅ 0

Android 创建与解析XML(六)—— 比较与使用

前面介绍了四种创建、解析XML的方式: 0、 Android 创建与解析XML(一)—— 概述 1、 Android 创建与解析XML(二)—— Dom方式 2、 Android 创建与解析XML(三)—— Sax方式 3、 Android ...

长平狐 ⋅ 2013/01/06 ⋅ 0

当你需要处理XML文档时

有2种方法(实际上,是2套 j2se API) a.dom: b.sax(Simple Api for XML): 详细参考:SAX和DOM解析XML区别 2.dom——源码剖析、机制原理 参考: 1.DOM 与 DOM 解析详解(一)基础 3.sax——源...

gzh412163 ⋅ 2014/06/20 ⋅ 0

sax/dom/jdom/dom4j的区别

网上能够查到很多的4种解析方式的区别,我再做一下摘录和总结,顺带给自己做个备份。 SAX sax分析器在对xml文档进行分析时,触发一系列的事件,应用程序通过事件处理函数实现对xml文档的访问....

zmf ⋅ 2015/04/08 ⋅ 0

使用SAX解析XML文件

SAX是Simple API for XML的缩写,它并不是由W3C官方所提出的标准,虽然如此,使用SAX的还是不少,几乎所有的XML解析器都会支持它。 与DOM比较而言,SAX是一种轻量型的方法。我们知道,在处理...

晨曦之光 ⋅ 2012/03/13 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

【elasticsearch】 随笔 Date datatype

一。时间类型的本质 首先json是没有时间类型的,对于es来说,时间类型的标示可以是下面三种情况 1.一个时间格式的字符串,如:"2014-11-27T08:05:32Z","2015-01-01" or "2015/01/01 12:10:3...

xiaomin0322 ⋅ 7分钟前 ⋅ 0

阿里云资源编排ROS使用教程

阿里云资源编排ROS详细内容: 阿里云资源编排ROS使用教程 资源编排(Resource Orchestration)是一种简单易用的云计算资源管理和自动化运维服务。用户通过模板描述多个云计算资源的依赖关系、...

mcy0425 ⋅ 9分钟前 ⋅ 0

适配器设计模式

1、适配器模式 把一个类的接口变换成客户端所期待的另一种接口 使原本因接口不匹配而无法在一起工作的两个类能够在一起工作 分为类的适配器模式和对象的适配器模式 2、类适配器模式 类的适配...

职业搬砖20年 ⋅ 13分钟前 ⋅ 0

npm操作报错 _stream_writable.js:61

有一天 不知道什么原因(估计和node的版本有关),无论你做什么npm的操作 都会报错/usr/local/lib/node_modules/npm/node_modules/readable-stream/lib/_stream_writable.js:61 这时候只要执...

lilugirl ⋅ 17分钟前 ⋅ 0

Eclipse安装插件的几种方式

Eclipse魅力之一就是支持可扩展的插件,来丰富自身的功能,这种方式也是建立在开源思想之上的。具体使用什么方式去安装插件,要看我们拿到的是什么。 1. 拿到的是一串URL,如http://subclips...

GordonNemo ⋅ 19分钟前 ⋅ 0

div图片叠加

css实现代码如下: <div style="position: relative;"><!--这个层为外面的父层,需设置相对位置样式--> <div style="position: absolute;"><!--子层,需设置绝对位置样式--> <i......

niithub ⋅ 21分钟前 ⋅ 0

作用域slot

如果父组件需要使用子组件中的内容怎么办,比如父组件需要控制子组件的显示 <div id="root"><child><template slot-scope="props"><h1>{{props.item}} <div>编辑</div></h1><......

金于虎 ⋅ 23分钟前 ⋅ 1

HongHu commonservice-eureka 项目构建过程

上一篇我们回顾了关于 spring cloud eureka的相关基础知识,现在我们针对于HongHu cloud的eureka项目做以下构建,整个构建的过程很简单,我会将每一步都构建过程记录下来,希望可以帮助到大家...

明理萝 ⋅ 26分钟前 ⋅ 1

xml和对象的相互转化

@Data//setter和getter方法,toString和equals,hashcode方法@EqualsAndHashCode//代表重写equals和hashcode方法@XmlAccessorType(XmlAccessType.FIELD)public class Classroom {@X......

拐美人 ⋅ 26分钟前 ⋅ 0

tableView cell的高度 分组头部尾部的高度 自适应

@property (nonatomic) CGFloat rowHeight; // default is UITableViewAutomaticDimension@property (nonatomic) CGFloat sectionHeaderHeight; // default is UITableViewA......

娜一片蓝色星海 ⋅ 27分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部