博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
XML解析
阅读量:6293 次
发布时间:2019-06-22

本文共 4003 字,大约阅读时间需要 13 分钟。

#define urlString @"http://localhost/files/test.xml"

void parseXml1(void)

{

    //  1, GDataXMLDocument

    //  2, GDataXMLElement

    

    NSData *data = [ NSData dataWithContentsOfURL:[NSURL URLWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]];

    NSError* error=nil;

    GDataXMLDocument * doc = [[ GDataXMLDocument alloc]initWithData:data options:0 error:&error];

    if (error) {

        NSLog(@"%@",error);

        return;

    }

 

    NSString* xpath1 = @"/root/books";

    //  注意:   documentnodesForXPath:@"/root/books",返回的是

    //         root这个节点的孩子列表(数组)

    //   =>    documentnodesForXPath:@"/root/books/book1",返回

    //         的是 books的孩子列表

    

    //   =>  如果要取某一个节点的值(是字符串),就要先得到该节点的同胞列表,

    //       然后根据该节点在列表中的位置取出这个节点并调stringValue方法

    //       得到字符串

    

    //  obj代表了books这个节点的内容,是多个节点的数组

    NSArray* obj = [doc nodesForXPath:xpath1 error:&error];

    

//    NSArray* obj = [[doc rootElement] children];

    

    if (error) {

        NSLog(@"%@",error);

        return;

    }

    //可以看到objclass NSArray

    NSLog(@"%@", NSStringFromClass([obj class]));

    //obj这个数组一共有一个元素,就是代表book1

    NSLog(@"数组的元素个数:%lu", [obj count]);

    //obj这个数组的首元素的类型为 GDataXMLElement

    NSLog(@"数组的第一个元素为:%@", NSStringFromClass([obj[0] class]));

    // 定义一个相对xml路径来取出book1下边的数组

    NSString* xpath2 =@"book1";

    

    //用相对xml路径来取数组

    NSArray* infoArray = [obj[0] nodesForXPath:xpath2 error:&error];

    NSLog(@"infoArray的类型为:%@", NSStringFromClass([infoArray class]));

    //infoArray: [ GDataXMLElement类型的元素    ]

    

    NSLog(@"infoArray的元素个数为:%lu", [infoArray count]);

    

    GDataXMLElement* element1 = infoArray[0];

    NSLog(@"element1:%@",[element1 stringValue]);

    

    

    NSArray * array1 = [ obj[0] children];

    NSLog(@"obj[0]的孩子列表数组的元素个数:%lu",[array1 count]);

    

    //array2 4个元素代表book1的四个子节点: name,author, price,summary

    NSArray* array2 = [ infoArray[0] children];

    NSLog(@"[infoArray[0]的孩子列表数组的元素个数:%lu]",[array2 count]);

    

    NSLog(@"书名为:%@", [array2[0] stringValue]);

    NSArray *authorInfoArray = [array2[1] children];

    NSLog(@"作者的名字:%@", [authorInfoArray[0] stringValue]);

    NSLog(@"作者的性别:%@", [authorInfoArray[1] stringValue]);

    NSLog(@"作者的年龄:%@",[authorInfoArray[2] stringValue]);

    NSLog(@"作者的地址:%@",[authorInfoArray[3] stringValue]);

    NSLog(@"书的价格:%@",[array2[2] stringValue]);

    NSLog(@"书的简介:%@", [array2[3] stringValue]);

}

 

void workForXml(void)

{

    NSData* data = [ NSData dataWithContentsOfURL:[NSURL URLWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]];

    NSError* error=nil;

    GDataXMLDocument * document = [[ GDataXMLDocument alloc]initWithData:data options:0 error:&error];

    if (error) {

        NSLog(@"%@",error);

        return;

    }

    //  注意:   documentnodesForXPath:@"/root/books",返回的是

    //         root这个节点的孩子列表(数组)

    //   =>    documentnodesForXPath:@"/root/books/book1",返回

    //         的是 books的的孩子列表

    

    //   =>  如果要取某一个节点的值(是字符串),就要先得到该节点的同胞列表,

    //       然后根据该节点在列表中的位置取出这个节点并调stringValue方法

    //       得到字符串

    

//    NSArray* childArrayOfBooks =[[document nodesForXPath:@"/root/books" error:&error][0] children];

    

    GDataXMLElement *booksNode = [[ document rootElement] children][0];

    

    NSArray* childrenOfBooks = [booksNode children];

    NSMutableArray * bookModelsArray= [[NSMutableArray alloc]init];

    

    for(NSUInteger i=0;i<[childrenOfBooks count];i++)

    {

        GDataXMLElement* book = childrenOfBooks[i];

        NSArray* childrenOfABook = [book children];

        

        //先取作者信息

        NSString* authorName = [[childrenOfABook[1] children][0] stringValue];

        NSString* authorSex = [[childrenOfABook[1] children][1] stringValue];

        NSString* authorAge=[[childrenOfABook[1] children][2] stringValue];

        NSString* authorAddress = [[childrenOfABook[1] children][3] stringValue];

        

        Author* author = [[Author alloc]initWithName:authorName andWithAge:authorAge andWithAddress:authorAddress andSex:authorSex];

        

        //取书名,书价,简介

        NSString* bookName = [childrenOfABook[0] stringValue];

        NSString* bookPrice = [childrenOfABook[2] stringValue];

        NSString* bookSummary = [childrenOfABook[3] stringValue];

        

        Book* bookModel = [[ Book alloc]initWithName:bookName andWithAuthor:author  andWithPrice:bookPrice andWithSummary:bookSummary];

        [bookModelsArray addObject:bookModel];

    }

    

    for(NSUInteger i=0;i<[bookModelsArray count];i++)

    {

        NSLog(@"书本信息:%@",bookModelsArray[i]);

    }

 

}

转载于:https://www.cnblogs.com/hyuganatsu/p/XML.html

你可能感兴趣的文章
sql server 实现多表连接查询
查看>>
HTTP 1.1与HTTP 1.0的比较
查看>>
如何在命令行脚本中启动带参数的Windows服务
查看>>
abstract vs interface
查看>>
nodejs笔记1 ----关于express不是本地命令
查看>>
python debug
查看>>
docker-machine 远程安装docker
查看>>
最全的常用正则表达式大全——包括校验数字、字符、一些特殊的需求等等
查看>>
Java Web之Servlet中response、request乱码问题解决
查看>>
felx屏蔽文本框输入回车
查看>>
[转载].NET商业软件源码保护
查看>>
第58件事 借势文案创作实例
查看>>
域名什么意思?
查看>>
ArcEngine创建要素类01
查看>>
Algs4-1.4.43大小可变的数组与链表
查看>>
hdoj 1058 Humble Numbers(dp)
查看>>
Falsk的模板分配和蓝图、定制错误信息、 和补充
查看>>
03:创建容器常用选项
查看>>
python常用模块(二)
查看>>
简单天气应用开发——解析HeWeather JSON
查看>>