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数据,通过GDataXML对data数据进行处理:
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; }