关闭

关于iOS解析XML使用NSXMLParser和GDataXML不得不说的一些事

标签: iosxml解析
276人阅读 评论(0) 收藏 举报
分类:
  1. NSXMLParser
    最近刚学习iOS,需要解析一个XML如下:http://wthrcdn.etouch.cn/WeatherApi?citykey=101050101,最开始选择使用自带的NSXMLParser,首先,NSXMLParser必须继承NSXMLParserDelegate协议
@interface ...   : ...  <NSXMLParserDelegate>

然后就是要初始化啦,
- (void)viewDidLoad {
NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];//设置XML数据
[parser setDelegate:self];
[parser parse];
}

(1)遍例xml的节点,是所有的节点

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
}

(2)当xml节点有值时,则进入,用来取出<a></a>之间的值

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
}

(3)当遇到结束标记时,进入,用来存储上述(2)取得值,

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
}

在遍历结束前,会反复执行上述三个方法,但是在解析的过程中,出现了一个问题,就是数字和文字分离的情况,比如,2级,解析的结果是2和级而不是2级,最终也没弄明白事什么原因,随后又换了GDataXML,就没有这个问题了。

2.GDataXML
GDataXMLNode是Google提供的用于XML数据处理的类集。该类集对libxml2–DOM处理方式进行了封装,能对较小或中等的xml文档进行读写操作且支持XPath语法。
(1)获取GDataXMLNode.h/m文件,将GDataXMLNode.h/m文件添加到工程中
(2)工程中增加“libxml2.dylib”库
(3)在工程的“Build Settings”页中找到“Header Search Path”项,添加/usr/include/libxml2”到路径中,在Linking中找到 Other Linker Flags 对应的值改为:-lxml2。
(4)添加“GDataXMLNode.h”文件到头文件中
首先,初始化GDataXMLDocument,在定义根元素,以及根元素下一层的孩子元素

- (void)viewDidLoad
{
    NSString *path = [NSString stringWithFormat:@"http://wthrcdn.etouch.cn/WeatherApi?citykey=101050101"];
    NSURL *url = [[NSURL alloc] initWithString:path];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    NSData *urlData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    GDataXMLDocument *xmlDoc = [[GDataXMLDocument alloc] initWithData:urlData options:0 error:nil];
    GDataXMLElement *xmlEle = [xmlDoc rootElement];  //根元素 resp
    NSArray *array = [xmlEle children];//孩子元素city,updatetime...
    [self parseXml:array];   
}

然后就是层层循环嵌套的过程啦

-(void) parseXml:(NSArray *)array
{
    for (int i = 0; i<[array count]; i++) {
        GDataXMLElement *ele = [array objectAtIndex:i];
        if([[ele name] isEqualToString:@"city"])
           ...
        else if ([[ele name] isEqualToString:@"forecast"]) {
            GDataXMLDocument *weatherxml = [[GDataXMLDocument alloc]initWithRootElement:ele];
            GDataXMLElement *weatherxmlele = [weatherxml rootElement];//根元素 forecast
            NSArray *weatherarray = [weatherxmlele children];//孩子元素 weather
            for(int j = 0;j<[weatherarray count];j++)
       }
    }
}

GDataXML的方式很容易理解,就是在不停嵌套的时候对跟和孩子不要弄晕就好啦!本人才疏学浅,有不对的地方还忘批评指正!

版权声明:本文为博主原创文章,未经博主允许不得转载。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:396次
    • 积分:16
    • 等级:
    • 排名:千里之外
    • 原创:1篇
    • 转载:1篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档