XML解析(NSXMLParser、GDataXML)

参考:http://my.oschina.net/LouWk/blog/112978

XML解析一般分俩种模式SAX和DOM,事件和文档。

SAX解析:事物模型解析,从头开始读取文档然后根据读取到的头标签时要怎么处理,读完头标签后,理论上是读取标签值,然后读取后遇到结束标签等。

只在xml文档中查找特定条件的内容,并且只提取需要的内容。这样占用内存小,灵活。缺点就是写。

DOM解析:把整个xml文档一次性读出,放在一个树形结构里。在需要的时候查找特定节点,然后对节点进行读和写。主要优势是实现简单,读写平衡;缺点是比较占内存,因为把整个xml文档都读入内存,文件越大缺点就越明显。

NSXMLParser详解

initWithContentsOfURL  通过NSURL创建解析器

initWithData                 通过NSData创建解析器

setDelegate                  为解析器定义委托

parse                           运行解析器

例子

NSString *str = [NSString stringWithFormat:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\

                         <Books>\

                         <Book id=\"1\">\

                         <title>Circumference</title>\

                         <author>Nicholas Nicastro</author>\

                         <summary>Eratosthenes and the Ancient</summary>\

                         </Book>\

                         <Book id=\"2\">\

                         <title>Copernicus Secret</title>\

                         <author>Jack Repcheck</author>\

                         <summary>How the scientific revolution began</summary>\

                         </Book> \

                         <Book id=\"3\">  \

                         <title>Angels and Demons</title>  \

                         <author>Dan Brown</author>  \

                         <summary>Robert Langdon is summoned to a Swiss</summary> \

                         </Book> \

                         </Books>  "];

- (BOOL)parser:(NSString *)string{

    NSXMLParser *par = [[NSXMLParser alloc] initWithData:[string dataUsingEncoding:NSUTF8StringEncoding]];//传递你要解析的数据

    [par setDelegate:self];

    return [par parse];//启动解析

}

//step 1 准备解析

- (void)parserDidStartDocument:(NSXMLParser *)parser{

    self.parserObjects = [[NSMutableArray alloc] initWithCapacity:0];

}

//step 2 读取第一个头节点,如果内部有属性值,你可以获取出来

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

    NSLog(@"elementName:%@\nnamespaceURI:%@\nqName:%@\n",elementName,namespaceURI,qName);

    NSLog(@"attributes:%@",attributeDict);

}

//step 3 获得首尾节点间的内容

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

    //获得首位节点间内容

    NSLog(@"string:%@",string);

    

}

//step 4 解析完当前节点

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

    //解析完当前节点

    NSLog(@"tail..............");

    NSLog(@"elementName:%@\nnamespaceURI:%@\nqName:%@",elementName,namespaceURI,qName);

}

//step 5 解析结束

- (void)parserDidEndDocument:(NSXMLParser *)parser{

}

//step 6 获取cdata块数据

- (void)parser:(NSXMLParser *)parser foundCDATA:(NSData *)CDATABlock{

    

}

GDATAXML详解

GDataXMLDocument:xml解析入口

GDataXMLElement:保存查找的数据

GDataXMLNode:保存解析的数据

        NSError *error;

        NSData *data = [NSData dataWithData:[str dataUsingEncoding:NSUTF8StringEncoding]];

        //设置GDataXMLDocument

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

        //解析

        GDataXMLElement *rootElement = [gdataXML rootElement];

        NSArray *arrStu = [rootElement elementsForName:@"Book"];

        NSMutableString *str1 = [[NSMutableString alloc] initWithCapacity:0];

        for (GDataXMLNode *node in arrStu) {

            [str1 appendFormat:@"=========book==========\n"];

            for (int k = 0; k < [node childCount]; k++) {

                GDataXMLNode *sub_node = [node childAtIndex:k];

                switch (k) {

                    case 0:

                        [str1 appendFormat:@"title=%@\r\n",[sub_node stringValue]];

                        break;

                    case 1:

                        [str1 appendFormat:@"author=%@\r\n",[sub_node stringValue]];

                        break;

                    case 2:

                        [str1 appendFormat:@"summary=%@\r\n",[sub_node stringValue]];

                        break;

                    default:

                        break;

                }

            }

        }



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值