zoukankan      html  css  js  c++  java
  • IOS XML的类型数据的解析

    在iPhone开发中,XML的解析有很多选择,iOS SDK提供了NSXMLParser和libxml2两个类库,另外还有很多第三方类库可选,例如TBXML、TouchXML、KissXML、TinyXML和GDataXML。问题是应该选择哪一个呢?

    解析 XML 通常有两种方式,DOM 和 SAX:

    • DOM解析XML时,读入整个XML文档并构建一个驻留内存的树结构(节点树),通过遍历树结构可以检索任意XML节点,读取它的属性和值。而且通常情况下,可以借助XPath,直接查询XML节点。
    • SAX解析XML,是基于事件通知的模式,一边读取XML文档一边处理,不必等整个文档加载完之后才采取操作,当在读取解析过程中遇到需要处理的对象,会发出通知对其进行处理。

    一般在iOS平台下,比较常用的XML解析类库有如下几种:

    安装说明
    GDataXML

    1. 从http://code.google.com/p/gdata-objectivec-client/downloads/list下载“gdata-objective-c client library.”

    2. 解压缩文件,找到Source\XMLSupport,并且将其中的GDataXMLNode.h 和 GDataXMLNode.m文件拖到项目中

    3. 选中项目,选中“Build Settings”标签页

    4. 将Build Settings页中,顶部的“Basic”标签切换到“All”

    5. 找到“Paths\Header Search Paths”项,并添加“/usr/include/libxml2”到列表中

    6. 找到“Linking\Other Linker Flags”项,并添加“-lxml2”到列表中

    clip_image002

    在需要调用GDataXML的代码文件头部,加入:

    #import “GDataXMLNode.h”

    TouchXML

    1. 从https://github.com/TouchCode/TouchXML下载最新TouchXML源码

    2. 解压后,将其中的Sources目录下的文件和目录都拖到项目中

    3. 选中项目,选中“Build Settings”标签页

    4. 将Build Settings页中,顶部的“Basic”标签切换到“All”

    5. 找到“Paths\Header Search Paths”项,并添加“/usr/include/libxml2”到列表中

    6. 找到“Linking\Other Linker Flags”项,并添加“-lxml2”到列表中

    在需要调用TouchXML的代码文件头部,加入:

    #import “TouchXML.h”

    TBXML

    1. 从http://www.tbxml.co.uk/TBXML/TBXML_Free.html下载最新TBXML源码

    2. 解压后,将其中的TBXML.h, TBXML.m, NSDataAdditions.h和NSDataAddtions.m四个文件拖到项目中

    3. 添加对libz.dylib类库的应用

    在需要调用TBXML的代码文件头部,加入:

    #import “TBXML.h”

    使用说明
    GDataXML

    读取XML文件,并解析成为DOM文档对象示例:

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

    NSData *xmlData = [[NSMutableData alloc] initWithContentsOfFile:filePath];

    NSError *error;

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

    if (doc == nil) { return nil; }

    NSLog(@"%@", doc.rootElement);

    [doc release];

    [xmlData release];

    转载:http://www.cnblogs.com/dotey/archive/2011/05/11/2042000.html

    下面专门介绍谷歌的GdataXml,GdataXml是专门的谷歌解析XML的解析类。就是之前的设置复杂点。

    GDataXml 相同标签的多个属性,好多文档都没有介绍获取属性的方法,让我找的好苦啊,必须分享!!!
    首先向Frameworks文件中添加libxml2.dylib这个库,而后再Croups & Files 侧边栏中双击我们的工程图标,找到 build 修改两个属性如下:
    在Search Paths中 找到Header Search Paths 将其对应的值修改为:/usr/includebxml2
    在Linking中找到 Other Linker Flags 对应的值改为:-lxml2
    GDataXMLDocument *doc=[[GDataXMLDocument alloc]initWithXMLString:resp*****eBody opti*****:2 error:nil];
    if (doc!=nil) {
    GDataXMLElement *root=[doc rootElement ];
    NSLog(@"--------root's children:--------\n%@", root);
    //取出根节点的所有孩子节点
    //取出某一个具体节点(body节点)
    [returnInfo setObject:[[[root elementsForName:@"db:uid"] objectAtIndex:0] stringValue] forKey:@"snsUserUid"];
    [returnInfo setObject:[[[root elementsForName:@"title"]objectAtIndex:0]stringValue] forKey:@"snsNickName"];
    [returnInfo setObject:[[[root elementsForName:@"db:location"]objectAtIndex:0]stringValue] forKey:@"snsProvince"];
    [returnInfo setObject:[[[[root elementsForName:@"link"] objectAtIndex:2]attributeForName:@"href"] stringValue] forKey:@"snsProfileImageUrl"];
    [returnInfo setObject:@"4" forKey:@"snsLandEntrance"];
    NSLog(@"%@",[[[root elementsForName:@"link"] objectAtIndex:2]attributes]);
    NSLog(@"%@",[[[root elementsForName:@"db:location"]objectAtIndex:0]stringValue]);
    }
    NSLog(@"returnInforeturnInforeturnInforeturnInforeturnInfo%@",returnInfo);

    谷歌的GdataXML支持Xpath语法查询

    <?xml version="1.0" encoding="ISO-8859-1"?> <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.90</price> </cd> <cd country="USA"> <title>Greatest Hits</title> <artist>Dolly Parton</artist> <price>9.90</price> </cd> </catalog>

    定位節點
    XML是樹狀結構,類似檔案系統內資料夾的結構,XPath也類似檔案系統的路徑命名方式。不過XPath 是一種模式(Pattern),可以選出 XML檔案中,路徑符合某個模式的所有節點出來。例如要選catalog底下的cd中所有price元素可以用:
    /catalog/cd/price   

     
    如果XPath的開頭是一個斜線(/)代表這是絕對路徑。如果開頭是兩個斜線(//)表示文件中所有符合模式的元素都會被選出來,即使是處於樹中不同的層級也會被選出來。以下的語法會選出文件中所有叫做cd的元素(在樹中的任何層級都會被選出來):
    //cd

     
    選擇未知的元素
    使用星號(Wildcards,*)可以選擇未知的元素。下面這個語法會選出/catalog/cd 的所有子元素:
    /catalog/cd/*

     
    以下的語法會選出所有catalog的子元素中,包含有price作為子元素的元素。
    /catalog/*/price

     
    以下的語法會選出有兩層父節點,叫做price的所有元素。
    /*/*/price

     
    以下的語法會選擇出文件中的所有元素。
    //*

     
    要注意的是,想要存取不分層級的元素,XPath語法必須以兩個斜線開頭(//),想要存取未知元素才用星號(*),星號只能代表未知名稱的元素,不能代表未知層級的元素。
     
    選擇分支
    使用中括號可以選擇分支。以下的語法從catalog的子元素中取出第一個叫做cd的元素。XPath的定義中沒有第0元素這種東西。
    /catalog/cd[1]

     
    以下語法選擇catalog中的最後一個cd元素:(XPathj並沒有定義 first() 這種函式喔,用上例的 [1]就可以取出第一個元素。
    /catalog/cd[last()]

     
    以下語法選出含有price子元素的所有/catalog/cd元素。
    /catalog/cd[price]

     
    以下語法選出price元素的值等於10.90的所有/catalog/cd元素
    /catalog/cd[price=10.90]

     
    以下語法選出price元素的值等於10.90的所有/catalog/cd元素 的price元素
    /catalog/cd[price=10.90]/price

     
    選擇一個以上的路徑
    使用Or運算元(|)就可以選擇一個以上的路徑。例如:
    /catalog/cd/title | catalog/cd/artist

     
    選擇所有title以及artist元素
    //title | //artist

     
    選擇所有title以及artist以及price元素
    //title | //artist | //price

     
    選擇屬性
    在XPath中,除了選擇元素以外,也可以選擇屬性。屬性都是以@開頭。例如選擇文件中所有叫做country的屬性:
    //@country
       
     
    選擇所有含有country這個屬性的cd元素:
    //cd[@country]
       
     
    以下語法選擇出含有屬性的所有cd元素
    //cd[@*]
       
     
    以下語法選擇出country屬性值為UK的cd元素
    //cd[@country='UK']

    后面资料转自:http://blog.csdn.net/luyifeiniu/article/details/626202

  • 相关阅读:
    推箱子
    去掉两个最高分、去掉两个最低分,求平均分
    投票选班长
    彩票
    闰年、平年
    闹钟
    手机号抽奖
    for练习--侦察兵
    兔子、棋盘放粮食、猴子吃桃
    for练习--凑法
  • 原文地址:https://www.cnblogs.com/qiqibo/p/2669691.html
Copyright © 2011-2022 走看看