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

    XML是一种可扩展标记语言的缩写。由元素和内容构成。

    xml实例:

    <?xml version="1.0" encoding="UTF-8"?>
    <resp>
    <city>北京</city>
    <updatetime>11:35</updatetime>
    <wendu>3</wendu>
    <fengli>2级</fengli>
    <shidu>77%</shidu>
    <fengxiang>南风</fengxiang>
    <sunrise_1>07:02</sunrise_1>
    <sunset_1>16:56</sunset_1>
    <sunrise_2/>
    <sunset_2/>
    </resp>

    1.XML声明:

    XML 版本:(<?xml version="1.0"?>

    XML的编码格式:encoding="UTF-8"?

    <?xml version="1.0" encoding="UTF-8"?>

    2.根元素:

    <resp>
    </resp>

    3.元素:开始标签和结束标签

    • 拥有内容的元素:<city>北京</city>
    • 没有内容的元素:<city></city>
    • 没有内容的元素简写:<city/>
    • 一个元素可以嵌套若干个子元素(不能出现交叉嵌套)

    4.一个元素可以拥有多个属性:

    <video name="小黄人 第01部" length="30" />
    //video元素拥有name和length两个属性
    //属性值必须用 双引号"" 或者 单引号'' 括住
    //实际上,属性表示的信息也可以用子元素来表示,比如 <video> <name>小黄人 第01部</name> <length>30</length> </video>

     5.XML的解析有两种方式:
    DOM:一次性将整个文档加载进内存,比较适合解析小文件。

    SAX:从根元素开始,一个元素一个元素的解析。比较适合解析大文件。

     6.苹果自带的XML解析方式:

     NSXMLParser:SAX方式解析,使用简单,操作方便。

    NSXMLParser *parser = [[NSXMLParser alloc]initWithData:data];//初始化xml解析器
            parser.delegate = self;//设置代理
            [parser parse];//开始解析(会阻塞线程)

    NSXMLParser的代理:

    -(void)parserDidStartDocument:(NSXMLParser *)parser{
        // 当扫描到文档的开始时调用(开始解析)
    }
    -(void)parserDidEndDocument:(NSXMLParser *)parser{
        // 当扫描到文档的结束时调用(解析完毕)
    }
    // 当扫描到元素的开始时调用(attributeDict存放着元素的属性)
    -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict
    {
        //存储起始标签
        startTag = elementName;
        
    }
    // 当扫描到元素的结束时调用
    -(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
        
    }
    //当解析器得到节点,起始标签和结束标签之间的数据时会调用
    -(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
    {
        //得到标签中的数据
        if ([startTag isEqualToString:@"city"]) {
            NSLog(@"%@",string);
        }else if ([startTag isEqualToString:@"updatetime"]){
             NSLog(@"%@",string);
        }else if ([startTag isEqualToString:@"fengli"]){
             NSLog(@"%@",string);
        }
    }

    7.使用第三方类库GDataXML对XML进行解析:(DOM解析方式)

         用cocopad安装GDataXML后,引入头文件#import "GDataXMLNode.h",然后发起数据请求,得到相应的data数据,通过GDataXMLdata数据进行处理:

    GDataXMLDocument *doc = [[GDataXMLDocument alloc]initWithHTMLData:data encoding:NSUTF8StringEncoding error:nil];//加载所有xml到内存中
            GDataXMLElement *rootElement = [doc rootElement];//获取根元素
            NSArray *elements = [rootElement elementsForName:@"body"];//获取所有子元素
            for (GDataXMLElement *ele in elements) {
                //子元素
                GDataXMLElement *ele1 = [[ele elementsForName:@"resp"]firstObject];
                GDataXMLElement *ele2 = [[ele1 elementsForName:@"updatetime"]firstObject];
                
                NSLog(@"%@", [ele2 stringValue]);
                
                //如果是属性数据的话可以使用
    //          NSString *wind = [ele attributeForName:@"wind"].stringValue;
    //          NSString *sunrise = [ele attributeForName:@"sunrise"].stringValue;
            }

     

  • 相关阅读:
    贝叶斯在机器学习中的应用(一)
    使用ajax发送的请求实现页面跳转
    关于welcom-file-list 失效
    在新的线程中使用session 出现的问题
    关于innerHtml= 与 html() 区别
    request.getAttribute()和 request.getParameter()有何区别?
    __STL_VOLATILE
    声明一个返回特定类型函数指针的函数
    关于vue的基础概念
    Vue.js结合vue-router和webpack编写单页路由项目
  • 原文地址:https://www.cnblogs.com/moxuexiaotong/p/4974102.html
Copyright © 2011-2022 走看看