IOS 网络浅析-(五 xml解析)

XML

  1. 可扩展标记语言
  2. 用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言
  3. 易读性高,编码手写难度小,数据量大

NSXMLParser解析方法

我们所用到的NSXMLParser是采用SAX方法解析

SAX(Simple API for XML)

  • 只能读,不能修改,只能顺序访问,适合解析大型XML,解析速度快
  • 常应用于处理大量数据的XML,实现异构系统的数据访问,实现跨平台
  • 从文档的开始通过每一节点移动,定位一个特定的节点

DOM(Document Object Model)

  • 不仅能读,还能修改,而且能够实现随机访问,缺点是解析速度慢,适合解析小型文档
  • 一般应用与小型的配置XML,方便操作
  • 为载入到内存的文档节点建立类型描述,呈现可横向移动、潜在巨大的树型结构
  • 在内存中生成节点树操作代价昂贵

xmlParser解析过程

NSXMLParser解析过程

1.创建NSXMLParser实例,并传入从服务器接收的XML数据

2.定义解析器代理

3.解析器解析

4.通过解析代理方法完成XML数据的解析

使用XML解析文档时使用协议<NSXMLParserDelegate>,实现它的代理方法 

// 1. 开始解析某个元素,会遍历整个XML,识别元素节点名称

- (void)parser:didStartElement:namespaceURI:qualifiedName:attributes:

// 2. 文本节点,得到文本节点里存储的信息数据,对于大数据可能会接收多次!为了节约内存开销

- (void)parser:foundCharacters:

// 3. 结束某个节点,存储从parser:foundCharacters:方法中获取到的信息

- (void)parser:didEndElement:namespaceURI:qualifiedName:

 注意:在解析过程中,上述三个方法会不停的重复执行,直到遍历完成为止

 // 4. 开始解析XML文档

- (void)parserDidStartDocument:

// 5. 解析XML文档结束

- (void)parserDidEndDocument:

// 6. 解析出错

- (void)parser:parseErrorOccurred:

 

在XMLParser解析过程中,还需要实现NSXMLParserDelegate代理方法

如果一个XML文件中包含多个对象在解析过程中,为了能够正确解析中文档中的数据,需要注意一下几点:

1.当前解析出得是对象还是元素值?

如果是对象,需要判断当前对象时第几个,是第一个对象,还是第二、第三……,如果是第N个,需要将第N-1的对象值取出保存。

如果是元素值,需要将解析出得数据,赋值给对应于对象的某个属性。

2.在解析过程中,每次读取的是一个字符,所有必须实现字符串的拼接过程,将解析出字符进行组合。用来判断当前解析出得是对象,还是元素名。或元素值。

 代码来啦———

//
//  ViewController.m
//  CX-XML解析
//
//  Created by ma c on 16/3/18.
//  Copyright © 2016年 xubaoaichiyu. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()<NSXMLParserDelegate>

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    NSURL * url = [NSURL URLWithString:@"http://192.168.1.200/train.xml"];
    
    NSURLRequest * request = [NSURLRequest requestWithURL:url];
    
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
       
        //xml解析
        
        NSXMLParser * parse = [[NSXMLParser alloc]initWithData:data];
        
        parse.delegate = self;
        
        [parse parse];
        
    }];
    
}
//打开文档
-(void)parserDidStartDocument:(NSXMLParser *)parser{
    
    NSLog(@"打开文档,开始解析");
    
}
//开始查找起始标签
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict{
    
    NSLog(@"开始元素:%@",elementName);
    NSLog(@"属性%@",attributeDict);
    
}
//获取标签内容
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
    
    NSLog(@"获取内容:%@",string);
    
}
//查找结束标签
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
    
    NSLog(@"结束标签:%@",elementName);
    
}
//查找文档结束
-(void)parserDidEndDocument:(NSXMLParser *)parser{
    
    NSLog(@"解析完成");
    
}

/*
 结果过长,截取部分。
 2016-03-18 10:25:21.734 CX-XML解析[4043:238219] 打开文档,开始解析
 2016-03-18 10:25:21.735 CX-XML解析[4043:238219] 开始元素:dataSet
 2016-03-18 10:25:21.736 CX-XML解析[4043:238219] 属性{
 xmlns = "http://WebXml.com.cn/";
 }
 2016-03-18 10:25:21.736 CX-XML解析[4043:238219] 获取内容:
 
 2016-03-18 10:25:21.736 CX-XML解析[4043:238219] 开始元素:diffgr:diffgram
 2016-03-18 10:25:21.737 CX-XML解析[4043:238219] 属性{
 "xmlns:diffgr" = "urn:schemas-microsoft-com:xml-diffgram-v1";
 "xmlns:msdata" = "urn:schemas-microsoft-com:xml-msdata";
 }
 2016-03-18 10:25:21.737 CX-XML解析[4043:238219] 获取内容:
 
 2016-03-18 10:25:22.074 CX-XML解析[4043:238219] 结束标签:diffgr:diffgram
 2016-03-18 10:25:22.074 CX-XML解析[4043:238219] 获取内容:
 2016-03-18 10:25:22.074 CX-XML解析[4043:238219] 结束标签:dataSet

 2016-03-18 10:25:22.074 CX-XML解析[4043:238219] 解析完成

 */

@end

 

posted @ 2016-03-18 10:40  旭宝爱吃鱼  阅读(383)  评论(0编辑  收藏  举报