nsxmlparser代理方法构造方法有哪些

Posts tagged ‘NSXMLParser’
日, 10:38 下午
XML用处很大… 用得很广… 最简单的来说用PHP和Javascript, JQuery都可以简单解析一个整齐的树结构XML文件
但是我们可爱的佛典网XML为复杂结构, 于是乎xslt帮不上什么忙了……我希望在新版的佛典中能包含所有的佛经, 于是简单并且高效的使用所有中华佛典网上的XML就是我的目标了.
于是,基于事件的XML解析器(Event-Driven XML Parser) NSXMLParser 就是我必须用到的了
继续前面的两篇Mac平台程序设计
1, 更改界面, 添加一个”解析一个目录里面的第一个的文件”的按钮
2, 构建XML解析部分
//1, 构建解析方法
-(void)parseXMLFile:(NSURL *)XMLURL //XMLURL为第一个文件的URL
NSXMLParser *eventParser = [[NSXMLParser alloc] initWithContentsOfURL:XMLURL];
[eventParser setDelegate:self];
//设置代理为本地
[eventParser parse];
//开始解析
NSLog(@&end Of parseXMLFile&);
//2, 解析开始后,所有XML的内容由NSXMLParserDelegate处理
所以一定要注意在本地添加&NSXMLParserDelegate&到文件头
//在NSXMLParser读到&p&的时候重写一个&p&标签,原来的是XML中的,无法直接使用
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName
attributes:(NSDictionary *)attributeDict
if ([elementName isEqualToString:@&p&]) {
[htmlDataString appendFormat:@&&p&&];
needOrNot = YES;
//我们需要&p&和&/p&中间的内容,其余的在end中设置NO
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
if(needOrNot)
[htmlDataString appendString:string]; //如上,将需要的字段添加到得到的html结构String中
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName
if ([elementName isEqualToString:@&p&]) {
[htmlDataString appendFormat:@&&/p&&];
needOrNot = NO;
//不需要的内容不允许上面的delegate去读取到htmlDataString中
- (void)parserDidEndDocument:(NSXMLParser *)parser
NSLog(htmlDataString); //在结束后输出得到的html数据结构.
这样我就可以对佛典网的复杂结构xml开始分析了, 之后会放出更多对该处理的细节
分类目录: &&|&trackbacks-0
[iPhone]XML文件解析 parsing-xml-files NSXMLParser
xml文件解析办法
xml是为了提高web数据交换量而出现的,虽然他现在web应用中并不广泛,但是由于他的格式良好,经常被用做配置文件的格式。比如tomcat的主配置文件server.xml,web.xml等等。
首先我们看一下需求。我们的目的主要是提取xml文件中的特定内容,又因为xml文件本身的格式良好,这种查询是非常有规律的,非常有利于我们 找到需要的信息。有时我们还可能把特定信息写回xml中,但是这种需求并不是必需的,因为配置文件都不会太大,我们完全可以通过手工办法进行修改。
对xml进行解析的标准有两种,sax以及dom。
首先这两种标准并不是针对java的,他们在各种语言环境下都可以实现。dom是真正的国际标准。sax是事实的标准,他不由任何商业组织维 护,而是由一个非商业的组织在运作。就像iso7层模型和tcp/ip一样,虽然sax不是正式的标准,但是一点不影响他在xml解析领域的地位。
dom实现的原理是把整个xml文档一次性读出,放在一个树型结构里。在需要的时候,查找特定节点,然后对节点进行读或写。他的主要优势是实现简单,读写平衡;缺点是比较占内存,因为他要把整个xml文档都读入内存,文件越大,这种缺点就越明显。
sax的实现方法和dom不同。他只在xml文档中查找特定条件的内容,并且只提取需要的内容。这样做占用内存小,灵活,正好满足我们的需求。他的缺点就是写,有些资料介绍了写入的方法,但是我感觉这对本例没有必要。
NSXMLParser 实现的是sax方法解析xml文件。IntroductionNSXMLParser&is a forward only reader or an event driven parser. What it means is, an event is raised whenever the parser comes across a start of an element, value, CDATA and so on. The delegate of NSXMLParser can then implement these events to capture XML data. Some of the events are raised multiple times like the start of an element, value of an element and so on. Since NSXMLParser is known as an event driven parser, we can only read data at the present node and cannot go back. The iPhone only supports NSXMLParser and not NSXMLDocument, which loads the whole XML tree in memory.
For example, say you have a simple XML file such as the following:
&?xml version= "1.0" encoding="UTF8"&
&article author="John Doe"&
&para&This is a very short article.&/para&
&/article&
The parser would report the following series of events to its delegate:
Started parsing document
Found start tag for element&article&---&article &
Found attribute&author&of element&article, value &John Doe&-----author="John Doe"
Found start tag for element&para -----&para&
Found characters ------This is a very short article. 【&element's value】
Found&end tag&for&element&para------&/para&
Found&end tag&for&element&article----&/article&
Ended parsing document
使用NSXMLParser步骤方法如下:
&&&&&&&步骤一,确定从xml文件 解析出来的数据如何保存--定义一个类(结构体)
&&&&&&&&&&&&&&&&&&&& 小提示:可能一个xml文件解析出的数据包含多个对象,可以用NSMutableArray来保存。如参考一中提到的books
&&&步骤二,自定义解析处理方法(主要三个方法)--Delegate代理
&&&&&& 为了使代码清晰 可以单独提出来作为一个类
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementNamenamespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedNameattributes:(NSDictionary *)attributeDict {
&&&& * 处理一:start tag for element 根据不同的元素名,创建不同的用于保存对应数据信息的对象(结构体)
&&&& * 处理二:attribute of the element 保存数据信息到对象(结构体)
if([elementName&isEqualToString:@"Books"]) {//Initialize the array.appDelegate.books = [[NSMutableArray alloc] init];}
aBook.bookID = [[attributeDict&objectForKey:@"id"] integerValue];
方法二:主要处理element's value&主要一般都是如下处理保存value值到字符串
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {if(!currentElementValue)currentElementValue = [[NSMutableString alloc] initWithString:string];else[currentElementValue appendString:string];NSLog(@"Processing Value: %@", currentElementValue);}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementNamenamespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
&&& *处理end tag for&element,判断不同的元素名,给予不同的处理 保存
if([elementName&isEqualToString:@"Book"]) {[appDelegate.books addObject:aBook];[aBook release];aBook =}
&&&&步骤三&获取xml文件,并建立NSXMLParser对象,后解析
如参考一中实例,从url获取xml文件,并实例化NSXMLParser对象
NSURL *url = [[NSURL alloc] initWithString:@"/site/iphonesdktutorials/xml/Books.xml"];NSXMLParser *xmlParser = [[NSXMLParser alloc]&initWithContentsOfURL:url];
//Initialize the delegate.实例化解析处理方法的代理(步骤二中定义的代理)XMLParser *parser = [[XMLParser alloc] initXMLParser];//Set delegate 设置NSXMLParser对象的解析方法代理[xmlParser&setDelegate:parser];//Start parsing the XML file.调用代理解析NSXMLParser对象BOOL success = [xmlParser parse];if(success)NSLog(@"No Errors");elseNSLog(@"Error Error Error!!!");
/*********************
/*********************
阅读(...) 评论() &查看:5631|回复:3
助理工程师
常言道:助人乃快乐之本,你想快乐吗?请帮助我一下吧!
& &能否给个用NSXMLParser解析本地XML文件的demo啊!
助理工程师
NSXMLParser解析XML,这原生的解析方法,你们那个音乐客户端用到过的吧。看一下你的代码啊
助理工程师
NSXMLParser的例子
解析的XML代码例子如下:
&?xml version=&1.0& encoding=&UTF-8&?&
& & &user name=&hoge& age=&20& /&
& & &user name=&fuga& age=&30& /&
代码如下:
static NSString *feedURLString = @&test.xml&;
- (void)parserDidStartDocument:(NSXMLParser *)parser
& & // 解析开始时的处理
- (void)parseXMLFileAtURL:(NSURL *)URL parseError:(NSError **)error
& & NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:URL];
& & [parser setDelegate:self];
& & [parser setShouldProcessNamespaces:NO];
& &[parser setShouldReportNamespacePrefixes:NO];
& &[parser setShouldResolveExternalEntities:NO];
& &[parser parse];
& & NSError *parseError = [parser parserError];
& & if (parseError && error) {
& && &&&*error = parseE
& & [parser release];
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
& & // 元素开始句柄
& & if (qName) {
& && &&&elementName = qN
& & if ([elementName isEqualToString:@&user&]) {
& && &&&// 输出属性值
& && &&&NSLog(@&Name is %@ , Age is %@&, [attributeDict objectForKey:@&name&], [attributeDict objectForKey:@&age&]);
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
& & // 元素终了句柄
& & if (qName) {
& && &&&elementName = qN
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
& & // 取得元素的text
NSError *parseError =
[self parseXMLFileAtURL:[NSURL URLWithString:feedURLString] parseError:&parseError];
实际使用的时候除最后两行以外,所有的当如一个类中,最后两个是启动该类的代码。
助理工程师
最受欢迎的XML分析器
iPhone最流行的XML解析器,以及每个一简要介绍:
& && &&&?& && &&&NSXMLParser是一个SAX解析器SDK中包含的iPhone默认的。 这是写在Objective - C和使用非常简单,但也许没有那么容易,因为DOM模型。
& && &&&?& && &&&libxml2的是一个开放源码库,包括iPhone SDK的默认情况下使用。 这是一个基于C的API,所以有点更多的工作比使用NSXML。 该库同时支持DOM和SAX处理。 该处理器的libxml2的SAX特别的凉爽,因为它有一个能够解析它的独特功能正在读取数据。 例如,你可以从网络上阅读大量的XML文档并显示数据,您正在阅读它给用户,而你还在下载。
& && &&&?& && &&&TBXML是一个轻量级的DOM XML解析器设计得尽可能快,而资源消耗少的内存。 它节省了验证时间不执行,不支持XPath和由被只读 - 即你可以阅读它的XML,但是你不能再修改XML和写回来。
& && &&&?& && &&&TouchXML是NSXML风格的DOM的XML解析器的iPhone。 TBXML一样,它也是只读的,但它不像TBXML支持XPath。
& && &&&?& && &&&KissXML是另一个NSSXML风格的DOM XML解析器的iPhone,其实TouchXML的基础上。 主要区别是KissXML还支持编辑和编写XML以及阅读。
& && &&&?& && &&&TinyXML的是一个小型的C -基于DOM的XML解析器头只包含4个C文件和两个。 它同时支持读取和编写XML文件,但它不支持自己的XPath。 但是,您可以使用相关的库 - 该TinyXPath - 。
& && &&&?& && &&&GDataXML是另一个NSXML风格的DOM XML解析器的iPhone,谷歌开发作为图书馆的一部分,他们的Objective - C的客户端。 短短的m文件和一个头组成,它同时支持阅读和编写XML文档和XPath查询。2404人阅读
ios开发中经常会用到解析XML,但是iOS提供的NSXmlParser只能解析encoding是utf-8的XML文件。即xml文件开头必须是
&!--?xml version=&1.0& encoding=&utf-8&?--&
在中文网页中,经常会碰到gb2312或GBK编码的XML文件,如
&!--?xml version=&1.0& encoding=&gb2312&?--&
当iphone开发中的NSXMLParser碰到非utf-8编码时,会直接触发parser:parseErrorOccurred:,返回的错误编码是31,之后直接退出。
解决这个问题的思路当然是把非utf-8编码转换为utf-8编码,这个功能可以通过NSString类进行转换。
问题在于如何判断文件的编码是什么。这一问题的解决思路在于ASCII码在任何编码方式下都是一样的,这样,只要将XML文件开头的若干字节(大部分XML文件的Encoding在头部前面位置)内容直接当成utf-8编码读出来,可以从中检索是否有您要转换的编码。
以处理GB2312编码转换为例:
//取XML文件的前40个字节
NSData * xmldata = [self.ItemData subdataWithRange:NSMakeRange(0,40)];
//以UTF-8编码进行解码
NSString *xmlstr = [[NSString alloc] initWithData:xmldata encoding:NSUTF8StringEncoding];
//NSLog(@&XML HEADER: %@&, xmlstr);
//搜索GB2312,如果找到,就对整个文件进行编码转换
if ([xmlstr rangeOfString:@&\&GB2312\&& options:NSCaseInsensitiveSearch].location != NSNotFound)
NSLog(@&GB2312 encoding founded.&);
NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_);
NSString *utf8str = [[[NSString alloc] initWithData:self.ItemData encoding:enc] autorelease];
utf8str = [utf8str stringByReplacingOccurrencesOfString:@&\&GB2312\&& withString:@&\&utf-8\&& options:NSCaseInsensitiveSearch range:NSMakeRange(0,40)];
NSData *newData = [utf8str dataUsingEncoding:NSUTF8StringEncoding];
self.ItemData = newD
最后提下我碰到的一个有意思的问题,即有时候下载的XML文件被HTML Process过了。我发现原因可能是URL中的大小写问题。如
这个地址,如果K6L变成k6l,下载的XML文件就变了,大家可以试试.
如果用HPPLE解析HTML,碰到中文GB2312或GBK编码的网页,要先用gb编码解码,然后替换其中的gb字符串,再用utf8编码成data给parser就能解析中文网页了。
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:160084次
积分:1659
积分:1659
排名:第13355名
原创:17篇
评论:16条
(5)(13)(3)

我要回帖

更多关于 nsxmlparser 的文章

 

随机推荐