网络数据解析(1) XML


解析的基本概念



解析: 从事先规定好的格式中提取数据
解析的前提: 提前约定好格式,数据提供方按照格式提供数据,数据获取方则按照格式获取数据
iOS开发常见的解析: XML解析,JSON解析
  • XML: Extensible Markup Language (可扩展标记语言),主流数据格式之一,可用来存储和传输数据  (Plist文件就是用XML格式存储数据的)





XML



  • XML数据格式的功能:
  1. 数据交换
  2. 内容管理
  3. 用作配置文件

  • XML数据结构的语法
  1. 声明
  2. 节点使用一对标签表示:起始和结束标签
  3. 根节点是起始节点,只有一个,节点可以嵌套
  4. 节点可以有值,存储在一对标签中.



SAX工具:
SAX : Simple API for XML. 基于事件驱动的解析方式,逐行解析数据.(采用协议回调机制)

  • NSXMLParser: 
  1. NSXMLParser是iOS自带的XML解析类,采用SAX方式解析数据
  2. 解析过程由NSXMLParserDelegate协议方法回调
  3. 解析过程: 开始标签->取值->结束标签

#import "ViewController.h"

#import "Student.h"

//NSXMLParserDelegate 协议是 iOS 中使用系统的 SAX 解析使用的协议
@interface ViewController ()<</span>NSXMLParserDelegate>
//数据源数组
@property (nonatomic, strong) NSMutableArray *dataArray;
//接收标签的名字
@property (nonatomic,strong) NSString *currentElement;

@end

@implementation ViewController

- (
void)viewDidLoad {
    [
super viewDidLoad];
   
self.view.backgroundColor = [UIColor yellowColor];
   
}

//触摸方法
- (
void)touchesBegan:(NSSet<</span>UITouch *> *)touches withEvent:(UIEvent *)event{
   
   
//获取XML_stu.txt文件的路径
   
//[NSBundle mainBundle]代表的是做梦那个文件夹栏
   
// pathForResource:@"文件名" ofType:@"文件格式"
   
NSString *path = [[NSBundle mainBundle]pathForResource:@"XML_stu" ofType:@"txt"];
   
// 通过文件路径 创建一个NSData对象
   
NSData *data = [NSData dataWithContentsOfFile:path];
   
   
NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];
   
//指定代理人
    parser.
delegate = self;
   
//开始解析
    [parser
parse];
}

//开始解析文档
- (void)parserDidStartDocument:(NSXMLParser *)parser{
  
    // (1) 初始化数组
    self.dataArray = [NSMutableArray array];   
}
// 检测开始标签
// 参数 1:
// 参数 2: element 标签的名字
// 以下三个基本不会使用到 , 基本为 nil
// 参数 3: 节点里面的命名空间 (xmlns)
// 参数 4: qName
// 参数 5: attributeDict 标签的属性
- (
void )parser:( NSXMLParser *)parser didStartElement:( NSString *)elementName namespaceURI:( NSString *)namespaceURI qualifiedName:( NSString *)qName attributes:( NSDictionary <</span>NSString *,NSString *> *)attributeDict{
   
   
//(2)如果标签的名字是student则表示 要创建一个model,并添加到数据源数组里面
    //(?1)给哪个属性赋值—>根据获取的标签的名字通过KVC赋值
    //(?2) 给哪个 Model 赋值 --> 给数组中最后一个 Model 赋值
   
// currentElement 赋值
   
self . currentElement = elementName;
   
    if ([elementName isEqualToString: @"student"]) {    
        Student *stu = [ Student new ];
        [
self . dataArray addObject :stu];
   }
   
NSLog ( @"Start elementName ---> %@" , elementName);
}

// 检测到标签中的值
// 参数 1:
// 参数 2:
- (
void )parser:( NSXMLParser *)parser foundCharacters:( NSString *)string{
    //将检测到的值 存入Model的具体属性  
        [[ self . dataArray lastObject ] setValue :string forKey : self . currentElement ];  
    NSLog(@"string ---> %@", string);  
}

// 检测结束标签(注 : 遇到开始标签和结束标签都会运行一次)
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
     //如果不置为 nil, 检测结束标签 这方法后运行 检测标签到中的值  时 string为空(\n),而key(self.currentElement未边) 则会修改之前的KVC赋值.
    self . currentElement = nil ;
    NSLog(@"End elementName ---> %@",elementName);    
}

// 结束解析文档
- (void)parserDidEndDocument:(NSXMLParser *)parser{
    //打印
    for ( Student *stu in self . dataArray ) {
       
NSLog ( @"%@ %@ %ld %@" ,stu. name ,stu. gender ,stu. age ,stu. hobby );
    }
   
NSLog ( @"%@" , self . dataArray );
}


@end




DOM工具:
  DOM:Document Object Model (文件对象模型) . DOM方式解析XML时, 读入整个XML文档并构建一个驻留内存的树结构(节点树), 通过遍历树结构可以检索任意XML节点, 读取它的属性和值. 而且通常情况下, 可以借助XPath, 直接查询XML节点.

GDataXMLNode :
  1. 采用DOM方式解析数据
  2. iOS包含一个C语言的动态链接库libxml2.tbd,解析熟读比NSXMLParser快.
  3. GDdataXMLNode是Google提供的XML解析类, 对libxml2.tbd(xcode7以前是 .dylib)进行了Objective-C的封装,能对较小或中等的xml文档进行读写操作且支持Path语法.

使用方法:
  1. 获取GDataXMLNode.h /.m 文件,将GDataXMLNode.h /.m文件添加到工程中.
  2. 向工程中增加”libxml2.tbd”动态库
  3. 在工程的”Build Settings”页中找到”Header Search Path”项,添加 "/usr/include/libxml2 "
  4. 导入”GDataXMLNode.h / .m” 文件到头文件中,如工程能编译通过,则说明GDataXMLNode添加成功.
属性和方法:
网络数据解析(1) <wbr>XML


 
#import "SecondViewController.h"
//DOM 解析
#import "GDataXMLNode.h"

#import "Student.h"
@interface
SecondViewController ()

@property ( nonatomic , strong ) NSMutableArray *dataArray;

@end

@implementation SecondViewController

- (
void )viewDidLoad {
    [
super viewDidLoad ];
   
self . view . backgroundColor = [ UIColor blueColor ];
   
self . dataArray = [ NSMutableArray array ];
}

- (
void )touchesBegan:( NSSet <</span>UITouch *> *)touches withEvent:(UIEvent *)event{
   
   
//获取XML_stu.txt文档并且转化为NSData
   
NSString *path = [[NSBundle mainBundle]pathForResource:@"XML_stu.txt" ofType:nil];
   
NSData *data = [NSData dataWithContentsOfFile:path];
   
   
NSError *error = nil;
   
//GDataXMLDocument XMLDOM解析使用的类
   
//参数 1: 解析的data对象
   
//参数 2: 一般就是0
   
//参数 3: error信息
   
GDataXMLDocument *document = [[GDataXMLDocument alloc]initWithData:data options:0 error:&error];
   
   
//获取到XML数据的根节点
   
//获取到根节点里面所有的东西,也就是说获取到students里面包含的所有东西 也就是说 获取到students里面包含的所有
   
GDataXMLElement *rootElement = [document rootElement];
   
NSLog(@"rootElement --> %@",rootElement);
   
   
for (GDataXMLElement *subElement in rootElement.children) {
       
//这里获取到的subElement保存的是student标签里面的内容,所以在这里创建对象
       
NSLog(@"subElement --> %@",subElement);
       
       
Student *student = [Student new];
       
       
for (GDataXMLElement *element in subElement.children) {
           
NSLog(@"%@",element);
           
           
//element 保存的就是student标签的所有子标签
           
//根据标签的名字 给属性赋值
           
//element.name 表示标签名字
           
//element.stringValue表示标签的值
           
if ([element.name isEqualToString:@"name"]) {
                student.
name = element.stringValue;
            }
           
if ([element.name isEqualToString:@"gender"]) {
                student.
gender = element.stringValue;
            }
           
if ([element.name isEqualToString:@"age"]) {
                student.
age = [element.stringValue integerValue];
            }
           
if ([element.name isEqualToString:@"hobby"]) {
                student.
hobby = element.stringValue;
            }
        }
        [
self.dataArray addObject:student];
    }
   
for (Student *student in self.dataArray) {
       
NSLog(@"%@ %@ %ld %@",student.name,student.gender,student.age,student.hobby);
    }
}

@end




XML的优缺点: 
  优点 : 
  1. 格式统一,符合标准
  2. 容易与其他系统进行远程交互,数据共享比较方便

  缺点:
  1. XML文件格式文件庞大, 格式复杂, 传输占用带宽.
  2. 服务器端和客户端都需要花费大量代码来解析XML,不论服务器端还是客户端都使用代码变得异常复杂和不容易维护
  3. 客服端不容浏览器之间解析XML的方式不一致,需要重复编写很多代码
  4. 服务器端和客户端解析XML花费资源和时间


Parser :    n. [计] 分析程序;语法剖析程式
Bundle     :         n. 束;捆
current :   adj. 现在的;流通的,通用的;最近的;草写的
element :   n. 元素;要素;原理;成分;自然环境
attribute:  n.属性,特质
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值