GDataXML之解析XML

                                          第一部分  使用GDataXML写XML文件

/*

 <!-- 7.客户端请求通讯录信息 -->

 <iq type="get" from="jaywon@localhost/3a5054e5" to="localhost" id="123456">

          <query xmlns="jabber:iq:roster"/>

 </iq>

 

 type 属性,说明了该 iq 的类型为 get,与 HTTP 类似,向服务器端请求信息

 from 属性,消息来源,这里是你的 JID

 to 属性,消息目标,这里是服务器域名

 id 属性,标记该请求 ID,当服务器处理完毕请求 get 类型的 iq 后,响应的 result 类型 iq ID 请求 iq ID 相同

 <query xmlns="jabber:iq:roster"/> 子标签,说明了客户端需要查询 roster

 */

假设我有上面这样一段文字,需要写成XML文件,那么我们可以使用GDataXML去写,那么思路又是什么呢?

思路:

 /**

     *使用GDataXMLXML的思路

     *

     *1.创建根节点

     *2.创建属性节点

     *3.把属性节点添加到根节点

     *4.创建子节点,并把它添加到根节点

     *5.根据根节点创建document对象

     *6.添加xml版本与编码信息

     *7.保存写好的xml

     */

代码如下:

192136_nswS_2332019.png

                                                第二部分 解析XML文件

假设服务器返回的XML数据如下:

/*<?xml version="1.0" encoding="UTF-8"?>

 <!-- 这是xml注释 -->

 <catalog>

     <cd country="USA">

         <title>Empire Burlesque</title>

         <artist>Bob Dylan</artist>

         <price>10.90</price>

     </cd>

     <cd country="UK">

         <title>Hide your heart</title>

         <artist>Bonnie Tyler</artist>

         <price>9.10</price>

     </cd>

     <cd country="USA">

         <title>Greatest Hits</title>

         <artist>Dolly Parton</artist>

         <price>9.90</price>

     

 </cd>

 </catalog>

*/

需要解析出来,此时的思路又是什么了?

思路:

/**

 *

 *使用GDataXML解析XML的思路

 *

 *1.读取XML文件

 *2.xml文件转换成NSData

 *3.data一次性读取到document

 *4.document里面拿到根节点

 *5.循环遍历子节点

 *6.保存

 *

 */

代码如下:

 NSString* filepath=[[NSBundle mainBundle]pathForResource:@"xml" ofType:@"xml"];

    NSData* data=[NSData dataWithContentsOfFile:filepath];

    GDataXMLDocument* document=[[GDataXMLDocument alloc]initWithData:data error:nil];

    GDataXMLElement* rootElement=[document rootElement];

    NSArray* allNode=[rootElement children];

    for (GDataXMLElement *element in allNode) {

        GDataXMLNode* node=[element attributes][0];

        NSString* namestring= [node  name];

        NSString* valueString=[node stringValue];

        NSLog(@"namestring%@",namestring);

        NSLog(@"valueString%@",valueString);

        

       NSArray* Element= [element children];

        for (GDataXMLElement* subElement in Element) {

            

            NSString *nodeName = [subElement name];

            NSString *nodeValue = [subElement stringValue];

            NSLog(@"--- %@ ", nodeName);

            NSLog(@"-%@",nodeValue);

        }

    }

结果如下:

193015_A71C_2332019.png

                               第三部分  解析HTML语言

<html>

    <head>

        <meta name="audience" content="webmaster">

        <meta name="robots" content="index,follow">

        <meta name="generator" content="">

        <link href="css_js/reset.css" rel="stylesheet" type="text/css" />

        <link href="css_js/style.css" rel="stylesheet" type="text/css">

        <!--[if IE 7]>

         <link rel="stylesheet" type="text/css" href="css_js/ieseven.css" />

         <![endif]-->

        <!--[if IE 6]>

         <link rel="stylesheet" type="text/css" href="css_js/ie.css" />

         <![endif]-->

        

        <link rel="SHORTCUT ICON" href="http://www.example.com/favicon.ico" type="image/x-icon">

    </head>

    <body>

        <p><a href="abc.php">1 line<br>

            <b>Bold line</b></a></p>

        

        

        <hr />

        

        

        <p><a href="123.php">2 line<br />

            <b>Bold line</b></p>

        

        

        <hr>

        

        <p><a href="567.php">3 line<br >

            <b>Bold line</p>

    </body>

</html>

有HTML语言如上,解析思路和解析XML语言一样

/**

 *使用GDataXML解析HTML的思路

 *

 *1.读取HTML文件

 *2.HTML文件转换成NSData

 *3.data一次性读取到document

 *4.document里面拿到根节点

 *5.循环遍历子节点

 *6.保存

 *

 */

代码如下:

-(void)parseHTML

{

    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"html" ofType:@"html"];

    NSData *htmlData = [NSData dataWithContentsOfFile:filePath];

    GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithHTMLData:htmlData error:NULL];

    NSString *xPath = @"//a/@href";

    

    NSArray *elementArr = [document nodesForXPath:xPath error:NULL];

    for (GDataXMLElement *element in elementArr) {

        NSString *nodeName = [element name];

        NSString *nodeValue = [element stringValue];

        NSLog(@"%@ - %@", nodeName, nodeValue);

    }

}

结果如下:

195036_44W5_2332019.png

                               第四部分   解析XML后通过xpath取文档中的节点

解析好XML文件之后,我们有时会需要从文件中取对我们有用的节点值,那么该怎么去了,答案是通过xpath.那么什么是XPath呢?

先看代码:

-(void)parseXMLForXPath

{

    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"xml" ofType:@"xml"];

    NSData *xmlData = [NSData dataWithContentsOfFile:filePath];

    GDataXMLDocument *document = [[GDataXMLDocument alloc] initWithData:xmlData error:NULL];

    

    NSString *xPath = @"//price[1]";

    

    NSArray *elementArr = [document nodesForXPath:xPath error:NULL];

    for (GDataXMLElement *element in elementArr) {

        NSString *nodeName = [element name];

        NSString *nodeValue = [element stringValue];

        NSLog(@"%@ - %@", nodeName, nodeValue);

    }

    printf("\n");

}

代码中的xpath那句表示:从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。

200338_H1AT_2332019.png

关于xpath语法的使用,请大家参考

http://www.w3school.com.cn/xpath/xpath_syntax.asp


转载于:https://my.oschina.net/iOSliuhui/blog/514437

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值