xml解析 -- GData

前端之家收集整理的这篇文章主要介绍了xml解析 -- GData前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

XML解析有两种情况,第一种是不带名称空间的XML,第二种是带名称空间的XML。

解析XML使用的是谷歌提供的第三方库:GData。在GData中使用最多的就是XPath语法解析,XPath语法解析针对两种格式的XML有不同的解析方式。


XPath返回的结果是一个数组。


不带名称空间的XML:

xml.txt

  1. <root>
  2. <books>
  3. <book id="1" language="ch" num="2">
  4. <name>甄嬛传</name>
  5. <auther>
  6. <name>流潋紫</name>
  7. </auther>
  8. <price>80.00</price>
  9. <summary>一部宫廷情感大戏,口碑极佳,被称为宫廷剧的终结篇,是一部具有里程碑意义的经典之作。在日本,韩国,美国等相继播出。</summary>
  10. </book>
  11. <book id="2" language="ch">
  12. <name>呐喊</name>
  13. <auther>
  14. <name>鲁迅</name>
  15. </auther>
  16. <price>12.00</price>
  17. <summary>揭示了中国的社会面貌,控诉了封建制度的罪恶,喊出了“五四”时期革命者的心声。它反映了“五四”彻底不妥协地反封建主义的革命精神,适应了中国革命从旧民主主义向新民主主义转变的需要,在中国现代文化史和文学史上占有重要地位!</summary>
  18. </book>
  19. <book id="3" language="en">
  20. <name>哈利波特</name>
  21. <auther>
  22. <name>JK罗琳</name>
  23. </auther>
  24. <price>365.00</price>
  25. <summary>主人公哈利·波特在霍格沃茨魔法学校六年的学习生活和冒险故事。</summary>
  26. </book>
  27. </books>
  28. </root>



使用Gdata中其他方式解析代码:(不常用)
  1. NSString *xmlPath=[[NSBundle mainBundle] pathForResource:@"xml" ofType:@"txt"];
  2. NSString *xmlStr=[NSString stringWithContentsOfFile:xmlPath encoding:NSUTF8StringEncoding error:nil];
  3. //使用谷歌提供的第三方库GData解析XML
  4. //文档类
  5. GdataxMLDocument *doc=[[GdataxMLDocument alloc]
  6. initWithXMLString:xmlStr options:0 error:nil];
  7. //取根节点
  8. GdataxMLElement *rootElement=doc.rootElement;
  9. //拿到books节点
  10. GdataxMLElement *booksElement=(GdataxMLElement *)[rootElement childAtIndex:0];
  11. //遍历books节点的子节点
  12. for (GdataxMLElement *book in [booksElement children]) {
  13. GdataxMLElement *nameElement=[[book elementsForName:@"name"] lastObject];
  14. NSLog(@"%@-%@",nameElement.name,nameElement.stringValue);
  15. GdataxMLElement* languageElement=(GdataxMLElement* )[book attributeForName:@"language"];
  16. //xmlString 打印出原型 language="ch"
  17. NSLog(@"%@",languageElement.XMLString);
  18. //stringValue 打印出元素的指 ch
  19. NSLog(@"%@",languageElement.stringValue);
  20. }

使用XPath语法解析:(常用)

/ 绝对路径

| 多路径

// 相对路径


//name 找出所有名为 name 的节点

//books/book[1]/name 找出第一本书的书名

//books/book[last()]/name 找到最后一本书名

//books/book[@num]/name 找到book中必须包含num属性

//books/book[@id=3]/name 找到book属性id,它的值为3


解析代码

  1. NSString *xmlPath=[[NSBundle mainBundle] pathForResource:@"xml" ofType:@"txt"];
  2. NSString *xmlStr=[NSString stringWithContentsOfFile:xmlPath encoding:NSUTF8StringEncoding error:nil];
  3. //使用谷歌提供的第三方库GData解析XML
  4. //文档类
  5. GdataxMLDocument *doc=[[GdataxMLDocument alloc]
  6. initWithXMLString:xmlStr options:0 error:nil];
  7. /*
  8. XPath 语法:
  9. / 绝对路径
  10. | 多路径
  11. // 相对路径
  12. /********/
  13. //name 找出所有名为 name 的节点
  14. //books/book[1]/name 找出第一本书的书名
  15. //books/book[last()]/name 找到最后一本书名
  16. //books/book[@num]/name 找到book中必须包含num的属性
  17. //books/book[@id=3]/name 找到book中属性为id,它的值为3
  18. /********/
  19. NSArray *ary=[doc nodesForXPath:@"root/books/book/name | root/books/book/price" error:nil];
  20. NSArray *ary1=[doc nodesForXPath:@"//name" error:nil];//找出所有名为 name 的节点
  21. NSArray *ary2=[doc nodesForXPath:@"//books/book[1]/name" error:nil];//混合使用
  22. NSArray *ary3=[doc nodesForXPath:@"//books/book[last()]/name" error:nil];//混合使用
  23. NSArray *ary4=[doc nodesForXPath:@"//books/book[@num]/name" error:nil];//混合使用
  24. NSArray *ary5=[doc nodesForXPath:@"//books/book[@id=3]/name" error:nil];//混合使用
  25. for (GdataxMLElement *elm in ary5) {
  26. NSLog(@"%@",elm.XMLString);
  27. }

带有名称空间的XML解析:


首先正对XML来说 什么是名称空间?

名称空间,也就是命名空间

关键字:xmlns -xml namespace

名称空间必须是一个地址url(网址 例如:http://www.baidu.com)

这样一来,元素应该这样书写:

<"http://www.baidu.com":name>XXX</name>

但是这样就很麻烦,所有我们将名称空间取别名

xmlns表示要声明一个名称空间

<root xmlns:book="http://www.baidu.com">

那么这样一来,元素就可以这样写

<book:name>XXX</name>

缺省名称空间,只要没显示声明属于哪个名称空间的节点,那么它就属于缺省名称空间

使用xmlns来声明一个缺省名称空间

<root xmlns="http://www.sina.cn">

那么元素为:<name>XXXX</name>


那么如何使用XPath语法来解析这种格式的XML呢?

注意一点:缺省名称空间必须写上xmlns:

  1. NSString *str1=[[NSBundle mainBundle] pathForResource:@"xmlns2" ofType:@"txt"];
  2. NSString *dataxml=[NSString stringWithContentsOfFile:str1 encoding:NSUTF8StringEncoding error:nil];
  3. GdataxMLDocument *docXmlns=[[GdataxMLDocument alloc] initWithXMLString:dataxml options:0 error:nil];
  4. /*
  5. <root xmlns:book="http://www.baidu.com"
  6. xmlns="http://www.sina.com.cn">
  7. <books>
  8. <book id="1" language="ch">
  9. <book:name>甄嬛传</book:name>
  10. */
  11. //缺省名称空间必须全部写上 xmlns:
  12. GdataxMLElement *bookElem=[[docXmlns nodesForXPath:@"<span style="color:#ff0000;">/xmlns:root/xmlns:books/xmlns:book[@id=3]/book:name</span>" namespaces:@{<span style="color:#ff0000;">@"xmlns":@"http://www.sina.com.cn",@"book":@"http://www.baidu.com"</span>} error:nil] firstObject];
  13. NSLog(@"%@",bookElem.stringValue);

猜你在找的XML相关文章