iOS开发2-使用SAX解析XML数据

XML数据结构和解析

1.1XML数据结构

XML 是可扩展标记语言(Extensible Markup Language)的缩写,其中的 标记(markup)是关键部分。可以创建内容,然后使用限定标记标记它,从而使每个单词、短语或块成为可识别、可分类的信息。创建的文件,或文档实例 由元素(标记)和内容构成。当从打印输出读取或以电子形式处理文档时,元素能够帮助更好地理解文档。元素的描述性越强,文档各部分越容易识别。自从出现标记至今,带有标记的内容就有一个优势,即在计算机系统缺失时,仍然可以通过标记理解打印出来数据。

什么是 XML?

XML 指可扩展标记语言(EXtensible Markup Language)

XML 是一种标记语言,很类似 HTML

XML 的设计宗旨是传输数据,而非显示数据

XML 标签没有被预定义。您需要自行定义标签。

XML 被设计为具有自我描述性。

没有任何行为的 XML

XML 是不作为的。

也许这有点难以理解,但是 XML 不会做任何事情。XML 被设计用来结构化、存储以及传输信息。

下面是 John 写给 George 的便签,存储为 XML:

<note>

<to>George</to>

<from>John</from>

<heading>Reminder</heading>

<body>Don‘t forget the meeting!</body>

</note>

上面的这条便签具有自我描述性。它拥有标题以及留言,同时包含了发送者和接受者的信息。但是,这个 XML 文档仍然没有做任何事情。它仅仅是包装在 XML 标签中的纯粹的信息。我们需要编写软件或者程序,才能传送、接收和显示出这个文档。

XML 仅仅是纯文本

XML 没什么特别的。它仅仅是纯文本而已。有能力处理纯文本的软件都可以处理 XML。

不过,能够读懂 XML 的应用程序可以有针对性地处理 XML 的标签。标签的功能性意义依赖于应用程序的特性。

XML 是独立于软件和硬件的信息传输工具。

1.2 使用SAX解析XML

SAX是Simple API for XML的缩写,解析XML时并不需要读入整个文档,而文档的读入过程也就是SAX的解析过程。

1.2 .1 第一种格式(没有写属性)

data_XML1.txt

<messages>

<message>
   <sender>小明</sender>
   <receiver>小红</receiver>
   <content>今天放学操场见</content>
   <date>2015年10月19日</date>
</message>

<message>
    <sender>小花</sender>
    <receiver>小王</receiver>
    <content>明天中午公园见</content>
    <date>2015年10月19日</date>
</message>

</messages>

//解析XML
    //1.SAX 逐行解析(系统提供)数据大使用
    //1.1提供文件路径字符串
    //获取文件1
     NSString * filePath1=[[NSBundle mainBundle]pathForResource:@"data_XML1" ofType:@"txt"];
     NSData * data1=[NSData dataWithContentsOfFile:filePath1];
        //1.2XML解析器
      NSXMLParser *parser1=[[NSXMLParser alloc]initWithData:data1];

    //设置代理
     parser1.delegate=self;

    //1.3启动解析器
    [parser1 parse];

    //显示解析得到的文档
    for (Message *m in self.dataArray) {
        NSLog(@"sender:%@",m.sender);
        NSLog(@"receiver:%@",m.receiver);
        NSLog(@"content:%@",m.content);
        NSLog(@"date:%@",m.date);
    }

#pragma mark --第一种文件格式

//开始解析文档
-(void)parserDidStartDocument:(NSXMLParser *)parser{
    NSLog(@"第一种文件格式");
    NSLog(@"开始解析文档");
    self.dataArray=[NSMutableArray array];//初始化数组
}
//解析到开始标签
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict{
    NSLog(@"开始标签elementName=%@",elementName);

    //判断标签,创建对象
    if ([elementName isEqualToString:@"message"]) {
        //检测到message  创建保存信息对象
        Message * m=[[Message alloc]init];
        //存入数组
        [self.dataArray addObject:m];
    }
    self.appendString=[NSMutableString string];//初始化拼接字符串
    //以数字开头的时候,读两次-所以需要拼接字符串
    //2015-10-19 11:10:46.411 内容string=2015
    //2015-10-19 11:10:46.411 内容string=年10月19日
}
//解析到内容标签
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
    NSLog(@"内容string=%@",string);
    //拼接字符串
    [self.appendString appendString:string];
}
//解析到结束标签
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
    NSLog(@"结束标签elementName=%@",elementName);

    //存入对象
    Message *m=self.dataArray.lastObject;//排在最后

    //存值-这种方式一个一个的赋值,如果标签太多就不方便了
//    if ([@"sender" isEqualToString:elementName]) {m.sender=self.appendString;}
//    if ([@"receiver" isEqualToString:elementName]) {m.receiver=self.appendString;}
//    if ([@"date" isEqualToString:elementName]) {m.date=self.appendString;}
//    if ([@"content" isEqualToString:elementName]) { m.content=self.appendString;}

    //存值 使用KVC很方便
    [m setValue:self.appendString forKey:elementName];
}
//解析到错误
-(void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError{
    NSLog(@"XML Error!");}
//结束解析文档
-(void)parserDidEndDocument:(NSXMLParser *)parser{
    NSLog(@"结束解析文档");}

1.2 .2 第二种格式(写在属性中)

data_XML2.txt

<messages>

<message sender="Sam" receiver="Jack" content="School  4PM" date="2015-10-19">
</message>

<message sender="Bob" receiver="Kate" content="School  7PM" date="2015年10月19日">
</message>

</messages>

//解析XML
    //1.SAX 逐行解析(系统提供)数据大使用
    //1.1提供文件路径字符串
      //获取文件2
     NSString * filePath2=[[NSBundle mainBundle]pathForResource:@"data_XML2" ofType:@"txt"];
     NSData * data2=[NSData dataWithContentsOfFile:filePath2];

    //1.2XML解析器

     NSXMLParser *parser2=[[NSXMLParser alloc]initWithData:data2];
    //设置代理

     parser2.delegate=self;
    //1.3启动解析器

    [parser2 parse];

    //显示解析得到的文档
    for (Message *m in self.dataArray) {
        NSLog(@"sender:%@",m.sender);
        NSLog(@"receiver:%@",m.receiver);
        NSLog(@"content:%@",m.content);
        NSLog(@"date:%@",m.date);
    }

#pragma mark --第二种文件格式
//第二种文件格式
-(void)parserDidStartDocument:(NSXMLParser *)parser{
    self.dataArray=[NSMutableArray array];
    NSLog(@"开始解析");
}

-(void)parserDidEndDocument:(NSXMLParser *)parser{
    NSLog(@"结束解析");
}

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

    //NSLog(@"attributeDict=%@",attributeDict);

    if ([elementName isEqualToString:@"message"]) {
        Message *m=[[Message alloc]init];
        [m setValuesForKeysWithDictionary:attributeDict];
        [self.dataArray addObject:m];
    }

}

代码下载(Xcode7.0.1)

时间: 2024-10-20 13:24:10

iOS开发2-使用SAX解析XML数据的相关文章

iOS开发:xmpp下的xml数据解析及修改上传

一.利用xmpp里的扩展文件进行xml数据解析,xml数据解析的框架需要自己手动写出. 包含这个头文件NSXMLElement+XMPP.m.主要使用了这个文件中的如下方法: - (NSXMLElement *)elementForName:(NSString *)name { NSArray *elements = [self elementsForName:name]; if ([elements count] > 0) { return [elements objectAtIndex:0]

Android 使用pull,sax解析xml

pull解析xml文件 1.获得XmlpullParser类的引用 这里有两种方法 //解析器工厂 XmlPullParserFactory factory=XmlPullParserFactory.newInstance(); XmlPullParser pullParser=factory.newPullParser(); //直接获得实例XmlPullParser pullParser= Xml.newPullParser(); 2.设置解析内容 通过setInput方法设置解析内容  

IOS开发使用NSXMLParser、GDataXML两种方式解析XML数据

概括:XML数据解析方式有 *IOS原生的NSXMLParser,只支持SAX方式解析,使用简单 *C语言的libxml2,同时支持DOM和SAX方式解析 *google的GDataXML,只支持DOM方式解析,基于libxml2,使用时需要将编译环境配置为非ARC,并添加libxml2.dylib动态库 GDataXMLDocument 1 使用GDataXML的DOM方式解析XML,需要导入#import "GDataXMLNode.h" /** *  DOM方式解析XML数据 *

【iOS开发-网络】两种常用的方法解析XML数据

解析XML数据常用的有两种方法 第一种 使用Google的GDataXMLNode解析XML数据 使用的是DOM方式解析 先把xml一口吞掉 然后一点一点的解析 第二种 使用苹果自带的NSXMLParser解析XML数据 使用的是SAX方式解析 一个标记一个标记的解析 第一种使用步骤 第一步 首先把GDataXML文件夹放入项目中 第二步 更改Bulid Setting里面的东西 更改头文件搜索路径 在Header Search Paths里面添加路径/usr/include/libxml2 在

Android系列之网络(四)----SAX方式解析XML数据

?[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4044170.html 联系方式:[email protected] [系列]Android系列之网络:(持续更新) Android系列之网络(一)----使用HttpClient发送HTTP请求(通过get方法获取数据) Android系列之网络(二)----HTTP请求头与响应头 Androi

网络相关系列之四:数据解析之SAX方式解析XML数据

一.XML和Json数据的引入: 通常情况下.每一个须要訪问网络的应用程序都会有一个自己的server.我们能够向server提交数据,也能够从server获取数据.只是这个时候就有一个问题,这些数据是以什么格式在网络上传输的呢?一般我们都会在网络上传输一些格式化后的数据,这样的数据会有一定的结构规格和语言,当还有一方收到数据消息后就能够依照同样的结构规格进行解析.从而取出它想要的那部分内容. 在网络上数据传输最经常使用的格式:XML和Json.本文就来学习一下XML数据的解析,Json格式的数

iOS解析XML数据

iOS中解析XML数据的类是  NSXMLParser,详细使用方法如下: 假设现在在内存中有XML的二进制数据对象(NSData):data(该数据可能来自网络,也可能是本地的文件数据),设置NSXMLParser对象的协议,代码如下: NSXMLParser *xmlParse = [[NSXMLParser alloc] initWithData:data]; [xmlParse setDelegate:self]; [xmlParse parse];// 解析开始 解析对象设置后,我们需

微信公众号开发之解析xml数据包

在上次开发的基础上(链接在这里:https://www.cnblogs.com/segho/p/11654719.html) 我们来对用户发送过来的消息进行解析: 需要用到dom4j.jar,自行百度下载资源 我们将xml文件解析文map键值对, 将其直观的反映在console控制台上 WxService中的parseRequest方法代码如下: 1 public static Map<String, String> parseRequest(InputStream is) { 2 Map&l

XML学习笔记(二):使用 DOM和SAX 解析XML :

一.XML解析的简介 1.一般来说xml解析的方式有两种,Dom与SAX,且各有优缺点.pull是第三种方法见:pull解析XML 1)DOM:dom对象树 ①.整个XML放入内存,转换为Document对象: ②.每个元素,转换成Element对象 ③.文本,转换成Text对象 ④.属性,转换成Attribute对象 优缺点:元素的CRUD比较简单,但是内存消耗大,大的xml文档不适合. 补充:内存不足时,可以修改参数,调整JVM的内存大小 1.java.lang.OutOfMemoryErr