zoukankan      html  css  js  c++  java
  • XML和解析

    XML和解析

    1.什么是XML?
    Extensible Markup Language,可扩展标记语言。
    一般也叫XML文档。
    和JSON一样,也是常用的一种用于交互的数据格式。

    2.XML语法
    1)一个常见的XML文档一般由以下部分组成
    1>文档声明:
    在XML最前面,必须编写一个文档声明,用来声明XML文档的类型。
    最简单的声明如:<?xml version='1.0'?>
    2>元素(Element)
    一个元素包括了开始标签和结束标签。<video>little yellow mn</video>
    一个元素可以嵌套若干个子元素(不能出现交叉嵌套)。
    注意:XML中的所有换行、空格都是字符,会当作具体内容。
    3>属性(Attribute)
    一个属性可以拥有多个属性。
    属性值必须用双引号“”或者单引号‘’括住。
    实际上,属性表示的信息也可以用子元素来表示。

    3.XML解析
    解析方式有两种:
    DOM:一次性将整个XML文档以树形结构加载进内存,内存消耗大,比较适合解析小文件。在iOS开发中默认不支持DOM方式解析。
    SAX:从根元素开始,按顺序一个元素一个元素往下解析,性能好,比较适合解析大文件。苹果推荐使用。
    1)苹果原生
    NSXMLParser:SAX方式解析,使用简单。
    2)第三方框架
    libxml2:纯C语言,默认包含在iOS SDK中,同时支持DOM和SAX方式解析。
    GDataXML:DOM方式解析,由Google开发,基于libxml2.
    KissXML:DOM方式解析。
    3)XML解析方式的选择建议
    大文件:NSXMLParser,libxml2
    小文件:GDataXML

    4.代码示例
    -(void)loadData
    {
    //1.url
    NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/video.xml"];
    //2.请求
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    //3.连接
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError){
    //xml的解析
    //1.实例化一个xml的解析器,通过代理来实现xml的解析
    NSXMLParser *parse = [[NSXMLParser alloc] initWithData:data];
    //2.设置代理
    parse.delegate = self;
    //3.解析器开始解析
    [parse parse];
    }];
    }
    /*代理方法*/
    /*1.打开文档,准备开始解析*/
    -(void)parserDidStartDocument:(NSXMLParser *)parser
    {
    //初始化数组容器,清空容器,便于多次加载数据
    [self.vedio removeAllObjects];
    }
    /*2.开始节点*/
    -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
    {
    //如果开始节点名称是video,就创建一个对象
    if([elementName isEqualToString:@"video"]){
    self.currentVideo = [[Video alloc] init];
    //设置videoID
    self.currentVideo.videoId = attributeDict[@"videoId"];
    }
    //清空字符串的内容,因为马上需要进入第三步,要开始拼接当前的节点的内容
    [self.elementString setString:@""];
    }
    /*3.发现节点里面的内容*/
    -(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
    {
    //开始拼接
    [self.elementString appendString:string];
    }
    /*4.结束节点*/
    -(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
    {
    if([elementName isEqualToString:@"video"]){
    //如果结束的节点是video,需要把这个对象添加到数组
    [self.video addObject:self.currentVideo];
    //如果节点结束,就可以把第二步创建的对象,设置name/length属性
    else if([elementName isEqualToString:@"name"]){
    //设置name
    //1.直接赋值
    self.currentVideo.name = self.elementString;
    //2.KVC赋值
    [self.currentVideo setValue:self.elementString forKey:@"name"];
    //3.改造
    [self.currentVideo setValue:self.elementString forKey:elementName];
    }else if([elementName isEqualToString:@"length"]){
    //设置length
    self.currentVideo.length = @([self.elementString integerValue]);
    }else if([elementName isEqualToString:@"desc"]){
    //设置desc
    self.currentVideo.desc = self.elementString;
    }


    //KVC改进上面的赋值代码
    }
    /*5.结束文档*/
    -(void)parserDidEndDocument:(NSXMLParser *)parser
    {
    //xml真正解析结束,可以更新UI
    dispatch_async(dispatch_get_main_queue(), ^{
    //将容器里的数据(self.videos)赋值给表格显示数据
    self.dataList = self.videos;
    });
    }

    5.注意点
    使用NSNumber防止服务器端返回null,在KVC赋值的时候程序崩溃。
    NSNumber *id;是可以使用的,不会导致程序崩溃。

    6.GDataXML使用
    1)根据报错地方的提示操作,消除错误。
    2)代码
    -(void)loadData
    {
    //1.url
    NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/video.xml"];
    //2.请求
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    //3.连接
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError){
    //将XML整个读入内存
    GDataXMLDocument *document = [[GDataXMLDocument alloc]initWithData:data error:NULL];
    for(GDataXMLElement *element in document.rootElement.children){
    //创建video对象
    Video *video = [[Video alloc] init];
    for(GDataXMLElement *node in element.children){
    NSLog(@"%@,%@", node.name, node.stringValue);
    //KVC赋值
    [video setValue:node.stringValue forKey:node.name];
    }
    NSLog(@"%@", element.attributes);
    //遍历element.attributes数组,拿到属性值
    for(GDtatXMLNode *att in element.attributes){
    //KVC赋值
    [video setValue:att.stringValue forKey:att.name];
    }
    //模型添加到数组
    [self.videos addObject:video];
    }
    }];
    }

  • 相关阅读:
    Postgresql中string转换成timestamp类型
    zTree节点重叠或者遮挡
    Powerdesigner+Execel
    Powerdesigner+PostgreSQL
    PostgreSQL 的 distinct on 的理解
    PostgreSql问题:ERROR: operator does not exist: timestamp without time zone > character varying
    git分支小问题
    SSH问题:系统启动时,spring配置文件解析失败,报”cvc-elt.1: 找不到元素 'beans' 的声明“异常
    PostgresSQL中的限制和级联删除
    sql语句添加删除外键及其约束
  • 原文地址:https://www.cnblogs.com/chars/p/4936042.html
Copyright © 2011-2022 走看看