微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

XML的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>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念
xml文件介绍及使用
xml编程(一)-xml语法
XML文件结构和基本语法
第2章 包装类