文档章节

XML的DOM、Sax解析

iOS赵师顺
 iOS赵师顺
发布于 2016/06/27 22:52
字数 765
阅读 30
收藏 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
博文 74
码字总数 36150
作品 0
昌平
程序员
Android 创建与解析XML(一)—— 概述

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

长平狐
2013/01/06
149
0
android xml解析的三种方式

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

球球
2016/09/24
5
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
221
0
Android 创建与解析XML(六)—— 比较与使用

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

长平狐
2013/01/06
1K
0
四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例)

众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM、SAX、JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml-apis.jar包里 SA...

Henrykin
2016/11/03
48
0

没有更多内容

加载失败,请刷新页面

加载更多

20181018 上课截图

![](https://oscimg.oschina.net/oscnet/49f66c08ab8c59a21a3b98889d961672f30.jpg) ![](https://oscimg.oschina.net/oscnet/a61bc2d618b403650dbd4bf68a671fabecb.jpg)......

小丑鱼00
29分钟前
0
0
WinDbg

参考来自:http://www.cnit.net.cn/?id=225 SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols ctrl + d to open dump_file Microsoft (R) Windows Debugger Version 6.12.0002.633......

xueyuse0012
今天
2
0
OSChina 周五乱弹 —— 想不想把92年的萝莉退货

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @罗马的王:分享松澤由美的单曲《地球ぎ》 很久没看圣斗士星矢了 《地球ぎ》- 松澤由美 手机党少年们想听歌,请使劲儿戳(这里) @开源中国首...

小小编辑
今天
14
2
springBoot条件配置

本篇介绍下,如何通过springboot的条件配置,控制Bean的创建 介绍下开发环境 JDK版本1.8 springboot版本是1.5.2 开发工具为 intellij idea(2018.2) 开发环境为 15款MacBook Pro 前言 很多时候,...

贺小五
今天
1
0
javascript source map 的使用

之前发现VS.NET会为压缩的js文添加一个与文件名同名的.map文件,一直没有搞懂他是用来做什么的,直接删除掉运行时浏览器又会报错,后来google了一直才真正搞懂了这个小小的map文件背后的巨大...

粒子数反转
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部