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;
        }

 

 

 

posted @ 2015-11-18 16:24  墨VS雪  阅读(230)  评论(0编辑  收藏  举报