XML文件解析

对下图XML文件进行解析:

person.xml

可以把这个XML数据的根目录看做是一个数组,数组里存放了4个叫person的字典(这四个对象通过id来区分),字典里有三个键值对(name、personID、age)

1.解析XML文件前的准备:

(1)要实现 <NSXMLParserDelegate>协议。

(2)实现几个代理方法:

//1.开始解析

-(void)parserDidStartDocument:(NSXMLParser *)parser

//2.解析到一个元素

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

//3.查看到一个元素的内容

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

//4.解析节点结束

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

(3)创建一个model类,用来接收上图中四个对象(看做是四个对象person1、person2person3person4

 

 

 

2.开始解析XML文件

第一步:获取xml文件

NSString *path = [[NSBundle mainBundle]pathForResource:@"person" ofType:@"xml”]; //xml文件路径

NSData *data = [NSData dataWithContentsOfFile:path]; //通过xml文件路径获取xml中的数据

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

xml.delegate = self; //当前类实现xml的代理

[xml parse];//开始解析

 

 

第二步:实现几个代理方法

 

//1.开始解析
-(void)parserDidStartDocument:(NSXMLParser *)parser{

NSLog(@"开始解析");

}

//2.解析到一个元素(节点)

<root>、  <person id="1”> 、  <name>  这些都被称为节点。

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

NSLog(@"解析到一个节点:%@",elementName);
   
    if ([elementName isEqualToString:@"person"]) {
       
        _model = [[Model alloc]init];
       
    }

}

//3.查看到一个元素的内容(节点和斜杠节点之间的内容jack)   <name>jack</name>

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

NSLog(@"查看到一个元素的内容:%@",string);
   
    _str = string;

}

//4.解析节点结束   遇到带斜杠的节点(</name>),会进入这个方法

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

NSLog(@"该节点结束解析:%@",elementName);

if ([elementName isEqualToString:@"root"]) {  //   遇到</root> 节点

NSLog(@"The End");
    }else if ([elementName isEqualToString:@"person"]){

//   遇到</person>节点

//一组数据结束(本xml文件一共四组)
       
        [_array addObject:_model]; //一个model对象被添加到数组
       
   
    }else{

//   遇到</name>        </personID>  </age>节点,说明已经读取到name、 personID 或者age的数据 _str了,在这里用KVC给model对象赋值

//elementName = name、 personID 或者age

[_model setValue:_str forKey:elementName]; //用KVC给model对象赋值

}

}

打印结果:

2016-01-23 10:17:09.115 1.22 xml数据存储[1118:30883] 开始解析
2016-01-23 10:17:09.115 1.22 xml
数据存储[1118:30883] 解析到一个节点:root
2016-01-23 10:17:09.116 1.22 xml
数据存储[1118:30883] 查看到一个元素的内容:
   
2016-01-23 10:17:09.116 1.22 xml
数据存储[1118:30883] 解析到一个节点:person
2016-01-23 10:17:09.116 1.22 xml
数据存储[1118:30883] 查看到一个元素的内容:
       
2016-01-23 10:17:09.116 1.22 xml
数据存储[1118:30883] 解析到一个节点:name
2016-01-23 10:17:09.116 1.22 xml
数据存储[1118:30883] 查看到一个元素的内容:jack
2016-01-23 10:17:09.116 1.22 xml
数据存储[1118:30883] 该节点结束解析:name
2016-01-23 10:17:09.117 1.22 xml
数据存储[1118:30883] 查看到一个元素的内容:
       
2016-01-23 10:17:09.117 1.22 xml
数据存储[1118:30883] 解析到一个节点:personID
2016-01-23 10:17:09.117 1.22 xml
数据存储[1118:30883] 查看到一个元素的内容:2015
2016-01-23 10:17:09.117 1.22 xml
数据存储[1118:30883] 该节点结束解析:personID
2016-01-23 10:17:09.117 1.22 xml
数据存储[1118:30883] 查看到一个元素的内容:
       
2016-01-23 10:17:09.117 1.22 xml
数据存储[1118:30883] 解析到一个节点:age
2016-01-23 10:17:09.118 1.22 xml
数据存储[1118:30883] 查看到一个元素的内容:20
2016-01-23 10:17:09.118 1.22 xml
数据存储[1118:30883] 该节点结束解析:age
2016-01-23 10:17:09.118 1.22 xml
数据存储[1118:30883] 查看到一个元素的内容:
   
2016-01-23 10:17:09.118 1.22 xml
数据存储[1118:30883] 该节点结束解析:person
2016-01-23 10:17:09.183 1.22 xml
数据存储[1118:30883] 查看到一个元素的内容:
   
2016-01-23 10:17:09.184 1.22 xml
数据存储[1118:30883] 解析到一个节点:person
2016-01-23 10:17:09.184 1.22 xml
数据存储[1118:30883] 查看到一个元素的内容:
       
2016-01-23 10:17:09.184 1.22 xml
数据存储[1118:30883] 解析到一个节点:name
2016-01-23 10:17:09.184 1.22 xml
数据存储[1118:30883] 查看到一个元素的内容:rose
2016-01-23 10:17:09.184 1.22 xml
数据存储[1118:30883] 该节点结束解析:name
2016-01-23 10:17:09.184 1.22 xml
数据存储[1118:30883] 查看到一个元素的内容:
       
2016-01-23 10:17:09.185 1.22 xml
数据存储[1118:30883] 解析到一个节点:personID
2016-01-23 10:17:09.185 1.22 xml
数据存储[1118:30883] 查看到一个元素的内容:2016
2016-01-23 10:17:09.185 1.22 xml
数据存储[1118:30883] 该节点结束解析:personID
2016-01-23 10:17:09.185 1.22 xml
数据存储[1118:30883] 查看到一个元素的内容:
       
2016-01-23 10:17:09.185 1.22 xml
数据存储[1118:30883] 解析到一个节点:age
2016-01-23 10:17:09.185 1.22 xml
数据存储[1118:30883] 查看到一个元素的内容:18
2016-01-23 10:17:09.185 1.22 xml
数据存储[1118:30883] 该节点结束解析:age
2016-01-23 10:17:09.186 1.22 xml
数据存储[1118:30883] 查看到一个元素的内容:
   
2016-01-23 10:17:09.186 1.22 xml
数据存储[1118:30883] 该节点结束解析:person
2016-01-23 10:17:09.212 1.22 xml
数据存储[1118:30883] 查看到一个元素的内容:
   
2016-01-23 10:17:09.212 1.22 xml
数据存储[1118:30883] 解析到一个节点:person
2016-01-23 10:17:09.212 1.22 xml
数据存储[1118:30883] 查看到一个元素的内容:
       
2016-01-23 10:17:09.212 1.22 xml
数据存储[1118:30883] 解析到一个节点:name
2016-01-23 10:17:09.213 1.22 xml
数据存储[1118:30883] 查看到一个元素的内容:tom
2016-01-23 10:17:09.213 1.22 xml
数据存储[1118:30883] 该节点结束解析:name
2016-01-23 10:17:09.213 1.22 xml
数据存储[1118:30883] 查看到一个元素的内容:
       
2016-01-23 10:17:09.213 1.22 xml
数据存储[1118:30883] 解析到一个节点:personID
2016-01-23 10:17:09.213 1.22 xml
数据存储[1118:30883] 查看到一个元素的内容:2017
2016-01-23 10:17:09.213 1.22 xml
数据存储[1118:30883] 该节点结束解析:personID
2016-01-23 10:17:09.214 1.22 xml
数据存储[1118:30883] 查看到一个元素的内容:
       
2016-01-23 10:17:09.214 1.22 xml
数据存储[1118:30883] 解析到一个节点:age
2016-01-23 10:17:09.214 1.22 xml
数据存储[1118:30883] 查看到一个元素的内容:19
2016-01-23 10:17:09.214 1.22 xml
数据存储[1118:30883] 该节点结束解析:age
2016-01-23 10:17:09.214 1.22 xml
数据存储[1118:30883] 查看到一个元素的内容:
   
2016-01-23 10:17:09.214 1.22 xml
数据存储[1118:30883] 该节点结束解析:person
2016-01-23 10:17:09.214 1.22 xml
数据存储[1118:30883] 查看到一个元素的内容:
   
2016-01-23 10:17:09.215 1.22 xml
数据存储[1118:30883] 解析到一个节点:person
2016-01-23 10:17:09.313 1.22 xml
数据存储[1118:30883] 查看到一个元素的内容:
       
2016-01-23 10:17:09.314 1.22 xml
数据存储[1118:30883] 解析到一个节点:name
2016-01-23 10:17:09.314 1.22 xml
数据存储[1118:30883] 查看到一个元素的内容:jerry
2016-01-23 10:17:09.314 1.22 xml
数据存储[1118:30883] 该节点结束解析:name
2016-01-23 10:17:09.314 1.22 xml
数据存储[1118:30883] 查看到一个元素的内容:
       
2016-01-23 10:17:09.314 1.22 xml
数据存储[1118:30883] 解析到一个节点:personID
2016-01-23 10:17:09.314 1.22 xml
数据存储[1118:30883] 查看到一个元素的内容:2018
2016-01-23 10:17:09.315 1.22 xml
数据存储[1118:30883] 该节点结束解析:personID
2016-01-23 10:17:09.315 1.22 xml
数据存储[1118:30883] 查看到一个元素的内容:
       
2016-01-23 10:17:09.315 1.22 xml
数据存储[1118:30883] 解析到一个节点:age
2016-01-23 10:17:09.315 1.22 xml
数据存储[1118:30883] 查看到一个元素的内容:21
2016-01-23 10:17:09.315 1.22 xml
数据存储[1118:30883] 该节点结束解析:age
2016-01-23 10:17:09.316 1.22 xml
数据存储[1118:30883] 查看到一个元素的内容:
   
2016-01-23 10:17:09.316 1.22 xml
数据存储[1118:30883] 该节点结束解析:person
2016-01-23 10:17:09.316 1.22 xml
数据存储[1118:30883] 查看到一个元素的内容:
2016-01-23 10:17:09.316 1.22 xml
数据存储[1118:30883] 该节点结束解析:root

2016-01-23 10:17:09.317 1.22 xml数据存储[1118:30883] The End

时间: 2024-10-17 08:29:50

XML文件解析的相关文章

android基础知识13:AndroidManifest.xml文件解析

1.重要性 AndroidManifest.xml是Android应用程序中最重要的文件之一.它是Android程序的全局配置文件,是每个 android程序中必须的文件.它位于我们开发的应用程序的根目录下,描述了package中的全局数据,包括package中暴露的组件 (activities, services, 等等),以及他们各自的实现类,各种能被处理的数据和启动位置等重要信息. 因此,该文件提供了Android系统所需要的关于该应用程序的必要信息,即在该应用程序的任何代码运行之前系统所

XML文件解析之JDOM解析

1.JDOM介绍 JDOM的官方网站是http://www.jdom.org/,JDOM解析用到的jar包可以在http://www.jdom.org/dist/binary/中下载,最新的JDOM2的版本是2.0.5,JDOM1的版本是1.1.3,根据官网中的介绍可以知道.JDOM是一个在基于内存的XML模型,它用于读写创建修改XML文档.JDOM和DOM相似因为他们都提供了内存XML文档模型,但是DOM被设计用于很多种语言(C,C++,ECMSctipr,Java,JScript,Lingo

java基础之概谈xml文件解析

XML已经成为一种很通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便.诸多web应用框架,其可配置的编程方式,给我们的开发带来了很大程度的便捷,但细细想来,它们的应用无一不是java bean与xml之间的转换解析.本文将对xml的两种操作标准DOM和SAX,从它们各自的特点.适用范围等方面进行简单介绍. DOM (Document Object Model) :DOM标准中,采用W3C标准表示XML,有多重语言支持,因此其跨平台性很好.采用DOM规范

XML文件解析【安卓7】——SAX解析

XML文件解析 XML解析:XML技术是Android平台的应用基础,  Android提供了多种解析XML的方式:SAX解析.DOM解析.PULL解析 SAX解析 SAX --Simple  API  forXML  (XML简单的API) --解析速度快.占用内存少 --提供一组简单的API用于解析XML文件 --SAX在解析XML文件前,先指定一个解析事件处理器(Handler),SAX会对XML文档进行简单的顺序扫描,当扫描到[文档(Document)的开始和结束.元素(Element)

XML文件解析器TXml

前几天看了开源的XML文件解析器TinyXml,它是怎么实现解析的没怎么看懂,于是决定自己实现一个,反正最近不忙.先命名为TXml.现在完成了解析和查询功能,全部代码加起来不到1000行,将会继续完善它.源码必共享 先简单说一下我的思路: 1:读取XML文件信息,并存入一个字符数组中: 2:遍历数组,将数组解析成一棵树: 3:以路径的方式查询和按属性查询: 这个解析器最麻烦的地方就在怎么将字符数组解析成一颗树.我们先看一下一个简单XML文件,他包括文件头.节点.节点名称及节点值.属性名称及属性值

八、Android学习第七天——XML文件解析方法(转)

(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 八.Android学习第七天——XML文件解析方法 XML文件:extensible markup language 定义:用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言. 解析XML的方式: SAX——Simple API for XML,既是一种接口,也是一个软件包采用的是事件驱动,也就是它解析

Win10系列:VC++ XML文件解析

XML文件按照元素标记来存储数据,通过遍历这些元素标记可以得到XML文件中所保存的数据.在C++/CX的类库中并未定义用于解析XML文件的类,但C++提供了能解析XML文件的框架和类库,如msxml4.libxml.IXMLDOM和TinyXML等,在使用C++/CX编写应用程序时可以通过C++提供的框架和类库来解析XML文件.TinyXML是一个轻量级解析XML的框架,本节将介绍如何使用此框架来解析一个XML文件. TinyXML框架包含了以下的类和函数,通过使用这些类和函数可以方便地读取一个

通过正则表达式实现简单xml文件解析

这是我通过正则表达式实现的xml文件解析工具,有些XHTML文件中包含特殊符号,暂时还无法正常使用. 设计思路:常见的xml文件都是单根树结构,工具的目的是通过递归的方式将整个文档树装载进一个Node对象.xml文档树上的每一个节点都是一个Node对象,对象拥有title.attribute和text三个自身变量以及一个childrenNode集合. 一.编写Node类 import java.io.Serializable; import java.util.HashMap; import j

JAVA之XML文件解析

在Java.Android开发中,xml文件的解析很重要.本人使用过的xml文件解析的方式有两种,一种是DOM文档解析.还有一种是SAX. DOM是基于文档树结构的.SAX是基于事件驱动的.SAX则是遇到标签则触发工作的.当解析器发现元素开始.元素结束.文本.文档的开始或结束等时,发送事件,程序员编写响应这些事件的代码,保存数据.优缺点很明显:DOM对于大型文件的操作不好(因为它要先读入整个文档到内存中),SAX为了解决这样问题.不用事先调入整个文档,占用资源少:SAX解析器代码比DOM解析器代

dtd与schema的区别&amp;XML文件解析常用方式

Schema和DTD 都是用来定义各种文件中XML标记的使用规范.Schema是标准的XML文件,而DTD则使用自己的特殊语法,因此,只需要知道XML的语法规则就可以编写Schema了,不需要再学习其它语法规则.可以使用相同的处理器来解读,Schema利用命名空间将文件中特殊的节点与Schema说明相联系,一个XML文件可以有多个对应的Schema,若是DTD的话,一个XML文件只能有一个相对应的DTD文件.Schema的内容模型是开放的,可以随意扩充,而DTD则无法解读扩充的内容.DTD只能把