`
jsntghf
  • 浏览: 2532005 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

NSXMLParser解析XML

    博客分类:
  • iOS
阅读更多

对xml进行解析的标准有两种:sax以及dom。

 

首先这两种标准并不是针对java的,他们在各种语言环境下都可以实现。dom是真正的国际标准,sax是事实的标准,它不由任何商业组织维护,而是由一个非商业的组织在运作。就像iso7层模型和tcp/ip一样,虽然sax不是正式的标准,但是一点也不影响他在xml解析领域的地位。

 

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

 

sax的实现方法和dom不同,他只在xml文档中查找特定条件的内容,并且只提取需要的内容。这样做占用内存小,灵活,正好满足我们的需求。他的缺点就是写,有些资料介绍了写入的方法,这里就不赘述了。

 

NSXMLParser实现的是sax方法解析xml文件。

 

xmlParseViewController.h

 

#import <UIKit/UIKit.h>

@interface xmlParseViewController : UIViewController<NSXMLParserDelegate> {
	NSMutableArray		*chatArray;
	NSString			*chatFile;
	
	NSMutableDictionary	*currentChatInfo;
	NSMutableString		*currentString;
    BOOL				storingCharacters;
	IBOutlet UITableView *table;
}

@end

 

xmlParseViewController.m

 

#import "xmlParseViewController.h"

@implementation xmlParseViewController

static NSString *kName_Chats = @"chats";
static NSString *kName_Chat = @"chat";
static NSString *kName_Speaker = @"speaker";
static NSString *kName_Text = @"text";

//开始处理xml数据,它会把整个xml遍历一遍,识别元素节点名称
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *) qualifiedName attributes:(NSDictionary *)attributeDict {
	if ([elementName isEqualToString:kName_Chats]) {
		[chatArray removeAllObjects];
	} else if ([elementName isEqualToString:kName_Chat]) {
		[currentChatInfo removeAllObjects];
	} else if ([elementName isEqualToString:kName_Speaker] || 
			   [elementName isEqualToString:kName_Text]) {
		[currentString setString:@""];
		storingCharacters = YES;
	}
}

//存储从parser:(NSXMLParser *)parser foundCharacters:(NSString *)string方法中获取到的信息
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    if ([elementName isEqualToString:kName_Chats]) {
    } else if ([elementName isEqualToString:kName_Chat]) {
		[chatArray addObject:[NSDictionary dictionaryWithDictionary:currentChatInfo]];
    } else if ([elementName isEqualToString:kName_Speaker] || [elementName isEqualToString:kName_Text]) {
		[currentChatInfo setObject:[NSString stringWithString:currentString] forKey:elementName];
    }
    
    storingCharacters = NO;
}

//得到文本节点里存储的信息数据
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    if (storingCharacters) [currentString appendString:string];
}

- (void)viewDidLoad {
    [super viewDidLoad];
	NSString *path=[[NSBundle mainBundle] pathForResource:@"chatLog" ofType:@"xml"];
	currentString = [[NSMutableString alloc] initWithCapacity:0];
	currentChatInfo = [[NSMutableDictionary alloc] initWithCapacity:2];
    chatArray = [[NSMutableArray alloc] initWithCapacity:0];
	[NSThread detachNewThreadSelector:@selector(loadThread:) toTarget:self withObject:path];
}

- (void) finshLoadFile {
	UITableView *tableView = (UITableView *)table;
	[tableView reloadData];
}

- (void) loadThread:(NSString *)xmlFile {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];	
	NSXMLParser *chatLogParser = [[NSXMLParser alloc] initWithContentsOfURL:[NSURL fileURLWithPath:xmlFile]];
	[chatLogParser setDelegate:self];
	[currentString setString:@""];
	[currentChatInfo removeAllObjects];
	
	[chatLogParser parse];
	[chatLogParser release];
	
	[self performSelectorOnMainThread:@selector(finshLoadFile) withObject:nil waitUntilDone:YES];
	[pool release];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [chatArray count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
		
		cell.backgroundColor = [UIColor colorWithRed:0.859f green:0.886f blue:0.929f alpha:1.0f];
		cell.selectionStyle = UITableViewCellSelectionStyleNone;
    }
    
	NSDictionary *chatInfo = [chatArray objectAtIndex:[indexPath row]];
    
	cell.textLabel.text = [chatInfo objectForKey:@"text"];
	cell.detailTextLabel.text = [chatInfo objectForKey:@"speaker"];
    return cell;
}

- (void)dealloc {
    [currentString release];
    [currentChatInfo release];
    [chatArray release];
    [super dealloc];
}

@end
 

主要就是实现NSXMLParserDelegate中的三个解析的方法。

分享到:
评论

相关推荐

    使用NSXMLParser解析XML数据

    在Objective-C中,我们可以利用苹果提供的`NSXMLParser`类来解析XML数据。本示例("XMLParserDemo")将深入探讨如何使用`NSXMLParser`进行XML解析。 `NSXMLParser`是Apple的Foundation框架的一部分,它提供了一个...

    ios xml解析 NSXMLParser

    ios xml解析 NSXMLParser。 NSXMLParser是基于SAX的解析方式。NSXMLParser采用了委托设计模式,因此他的实现类需要采用协议并支持委托。NSXMLParser解析XML需要委托NSXMLParserDelegate实现。

    ios小程序--解析xml文件,读取新闻

    以下是如何使用NSXMLParser解析XML的步骤: 1. 创建一个NSXMLParser对象,传入XML数据源。 2. 实现NSXMLParserDelegate协议,定义处理XML元素开始、结束、属性等事件的方法。 3. 开始解析过程,`[parser parse]`。 ...

    iphone中XML解析例子

    1. 使用NSXMLParser解析XML: NSXMLParser是一个Objective-C类,它会在解析过程中触发一系列的代理方法。你需要实现这些方法来处理XML元素的开始、结束、属性等。例如,`-parser:didStartElement:namespaceURI:...

    IOS应用源码——对xml文件的解析与导出数据存储在xml中(代码)xmlparser.zip

    总之,这个源码示例可能展示了如何使用NSXMLParser解析XML文件,提取所需数据,并将数据存储回XML文件的过程。通过深入理解XML解析和数据持久化机制,开发者可以更好地处理iOS应用中的数据交换和存储需求。

    iphone Reachability NSConnection NSXMLParser

    3. NSConnection接收到数据后,启动NSXMLParser解析XML内容。 4. 实现NSXMLParserDelegate协议,定义处理XML元素的回调方法,将解析出的数据转化为应用程序所需的模型对象。 5. 将解析好的数据展示给用户或存储到...

    基于Swift实现的项目集合

    使用NSXMLParser解析XML;使用NSJSONSerialization解析JSON。 # GCD Grand Central Dispatch (GCD)多线程。 # UI UIKit Framework Reference # Photo Photos Framework And PhotosUI Framework。 # Utils ...

    IOS解析XML文件

    首先,iOS提供了两种主要的方式来解析XML数据:NSXMLParser和GDataXMLNode。NSXMLParser是苹果提供的原生XML解析器,基于事件驱动模型,适合处理大型XML文件,因为它不需要一次性加载整个文件到内存。而GDataXMLNode...

    Soap请求网络数据

    接下来,描述中提到了"使用NSXMLParser解析Xml"。当接收到SOAP响应,其数据格式通常是XML,我们需要解析这些数据以获取有用的信息。NSXMLParser是Apple提供的一款XML解析器,它可以逐行解析XML文档,根据元素的开始...

    xmlparsing-with-nsxmlparser-tutorial:使用NSXMLParser进行XMLParsing-教程

    NSXMLParser是Apple提供的一个Objective-C类,它允许开发者解析XML文档。本教程将深入探讨如何使用NSXMLParser进行XML解析,特别关注在iOS应用中实现这一过程的细节。 XML文档结构清晰,具有自解释性,可以包含元素...

    使用Swift实现iOS App中解析XML格式数据的教程

    总结来说,使用Swift和NSXMLParser解析XML数据主要包括以下步骤: 1. 创建NSXMLParser实例,传入XML文件URL。 2. 设置代理为遵循NSXMLParserDelegate协议的对象。 3. 实现NSXMLParserDelegate的方法,如`parser(_:...

    ios 简单xml解析DEMO绝对可用

    下面我们将详细介绍如何使用`NSXMLParser`来解析XML数据。 1. **创建XML解析器实例** 首先,你需要创建一个`NSXMLParser`实例,传入XML数据的NSData对象。在解析过程中,`NSXMLParser`会调用一系列的代理方法,...

    ReactiveNSXMLParser:NSXMLParser的ReactiveCocoa扩展

    用于NSXMLParser的ReactiveCocoa扩展:一种简洁的,基于流的API,用于使用NSXMLParser解析XML。 围绕定义包装器,从而不再需要实现繁琐的委托方法。 应用所需的任何ReactiveCocoa魔术(请参阅 ): # import " ...

    iOS解析xml通用类

    在iOS中,有多种解析XML的方法,如NSXMLParser、GDataXMLNode和libxml等。libxml是一个功能强大的C语言库,提供了XML解析、DOM操作和XPath等功能,适用于需要高效、低级操作的场景。 在这个通用类中,核心是使用...

    iOS xml解析和json解析demo

    总结一下,这个"iOS xml解析和json解析demo"将涵盖如何在iOS应用中解析XML数据,包括使用NSXMLParser和XMLParser,以及如何解析和序列化JSON数据,包括使用内置的JSONSerialization类和可能涉及的一些第三方库。...

    AISHTTP发送请求,NSXML解析XML文件

    本话题将深入探讨如何使用AISHTTP发送网络请求,并利用NSXMLParser解析接收到的XML文件,以及开源中国项目中使用TBXML作为替代的解析器。 首先,AISHTTP是一个基于NSURLConnection的网络请求库,它简化了HTTP请求的...

    ios中xml解析demo

    GDataXML库(又称libxml2)是一个Objective-C封装的XML解析库,它提供了一种更面向对象的方式来解析XML。与NSXMLParser不同,GDataXML支持XPath查询,允许开发者更方便地定位和提取XML文档中的特定节点。例如,可以...

    ios-iOS xml解析.zip

    xml解析的两种常用方式, DOM解析:一次性将整个XML文档加载进内存,比较适合解析小文件,例如:GDataXml解析 ...SAX解析:从根元素开始,按顺序一个元素一个元素往下解析,比较适合解析大文件,例如:NSXMLParser解析

    OC中JSON或XML解析

    OC中可以使用NSXMLParser来解析XML文档。 1. 创建XML解析器并设置代理: ```objective-c NSXMLParser *parser = [[NSXMLParser alloc] initWithData:xmlData]; parser.delegate = self; [parser parse]; ``` ...

Global site tag (gtag.js) - Google Analytics