XML的DOM、Sax解析
2016-06-27 00:00
225 查看
摘要: DOM适于解析比较简单的XML而SAX则适于解析较复杂的XML文件。各有各的好。
DOM和SAX的不同:
1. DOM是基于内存的,不管文件有多大,都会将所有的内容预先装载到内存中。从而消耗很大的内存空间。而SAX是基于事件的。当某个事件被触发时,才获取相应的XML的部分数据,从而不管XML文件有多大,都只占用了少量的内存空间。
2. DOM可以读取XML也可以向XML文件中插入数据,而SAX却只能对XML进行读取,而不能在文件中插入数据。这也是SAX的一个缺点。
3.SAX的另一个缺点:DOM我们可以指定要访问的元素进行随机访问,而SAX则不...
#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>
DOM和SAX的不同:
1. DOM是基于内存的,不管文件有多大,都会将所有的内容预先装载到内存中。从而消耗很大的内存空间。而SAX是基于事件的。当某个事件被触发时,才获取相应的XML的部分数据,从而不管XML文件有多大,都只占用了少量的内存空间。
2. DOM可以读取XML也可以向XML文件中插入数据,而SAX却只能对XML进行读取,而不能在文件中插入数据。这也是SAX的一个缺点。
3.SAX的另一个缺点:DOM我们可以指定要访问的元素进行随机访问,而SAX则不...
#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>
相关文章推荐
- JavaWEB.xml解析技术SAX&DOM(学习笔记)
- XML的四大解析方式浅析
- Android笔记三(网络技术)
- sax解析技术
- 【Android--工具】 SAX解析XML
- Android:采用SAX解析XML实例
- 黑马程序员——java解析XML文件(SAX解析 和 DOM解析)
- 使用jaxp进行sax解析
- XML解析---SAX
- 不依赖第三方jar包的通过java sax解析本地xml文件的实例代码
- Android解析自定义xml文件--Sax解析xml文件,测试demo(方案二)
- XML基础和XML编程
- SAX解析
- iOS Objective-C 解析XML SAX解析方法
- XML 解析---dom解析和sax解析
- SAX解析
- dom、sax、pull解析的优缺点
- SAX解析,DOM解析以及XML HTML JSON之间区别
- XML之sax解析
- android xml-----Sax解析