利用 NSXMLParser 类解析 XML 文件时所遇到的问题

本文详细介绍了如何使用Objective-C编程语言解析XML文件,并通过实际案例展示了在解析过程中遇到的问题及解决方法。通过修正XML文件中的编码和结束标记,最终成功实现了文件解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为了能演示解析XML文件,并将解析的结果输出到控件台上,在此声明并实现了一个 UIViewController 类的子类 XMLParserViewController, 这个子类将实现 NSXMLParserDelegate 委托中的方法以便解析 XML文件。子类 XMLParserViewController 的代码如下:

 

XMLParserViewController.h 文件:

#import <UIKit/UIKit.h>

@interface XMLParserViewController : UIViewController <NSXMLParserDelegate> {
	@public
	NSXMLParser *myXMLParser;

}

@property (nonatomic, retain) NSXMLParser *myXMLParser;

@end

 

XMLParserViewController.m 文件:

#import "XMLParserViewController.h"

@implementation XMLParserViewController

@synthesize myXMLParser;

- (void)viewDidLoad {
	[super viewDidLoad];
	
	NSBundle *mainBundle = [NSBundle mainBundle];
	
	NSString *filePath = [mainBundle pathForResource:@"Test" ofType:@"xml"];
	
	if ([filePath length] == 0) {
		return;
	}
	
	NSFileManager *fileManager = [[NSFileManager alloc] init];
	
	if ([fileManager fileExistsAtPath:filePath] == NO) {
		NSLog(@"The file doesn't exist.");
		[fileManager release];
		return;
	}
	
	[fileManager release];
	
	NSData *xmlData = [NSData dataWithContentsOfFile:filePath];
	
	NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:xmlData];
	self.myXMLParser = xmlParser;
	[xmlParser release];
	
	[self.myXMLParser setDelegate:self];
	
	if ([self.myXMLParser parse] == YES) {
		NSLog(@"Successfully to start xml parser.");
	}
	else {
		NSError *parsingError = [self.myXMLParser parserError];
		NSLog(@"%@", parsingError);
	}

					   
}




- (void)didReceiveMemoryWarning {
	// Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];
	
	// Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
	// Release any retained subviews of the main view.
	// e.g. self.myOutlet = nil;
	[super viewDidUnload];
	
	self.myXMLParser = nil;
}


- (void)dealloc {
	[myXMLParser release];
	
    [super dealloc];
}

#pragma mark -
#pragma mark XMLParser Delegate

- (void)parser:(NSXMLParser *)parser 
	didStartElement:(NSString *)elementName 
	namespaceURI:(NSString *)namespaceURI 
	qualifiedName:(NSString *)qName 
	attributes:(NSDictionary *)attributeDict {
	
	NSLog(@"Element Name = %@", elementName);
	NSLog(@"Number of attributes = %lu", [attributeDict count]);
	
	if ([attributeDict count] > 0) {
		NSLog(@"Attributes dictionary = %@", attributeDict);
	}
	
	NSLog(@"==============================");
}

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

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

@end

 

注:上述代码摘自《ISO4 编程经典实例》一书。


 从上面的实现文件 XMLParserViewController.m 中可以看出,我们将要解析文件为 Test.xml 。为此,我自己创建并手写了以下 Text.xml 文件:

<?xml version="1.0"encoding="UTF-8"?>
	<parent>
		<child name = "James">
			<age>30</age>
			<sex>male></sex>
		</child>
	</parent>
</xml>

保存并运行,控制台输出结果如下:



显然,控制台中显示的信息告诉我们:解析过程有问题了!

 

于是,我再次检查了手写的 Test.xml 文件,并对第一行做了相应的修正:使 endoding 属性前留一空格。

<?xml version="1.0" encoding="UTF-8" ?>
	<parent>
		<child name = "James">
			<age>10</age>
			<sex>male></sex>
		</child>
	</parent>
</xml>

 

保存并运行,控制台输出结果如下:


 

这个结果比之前的好多了,Test.xml  文件能被解析。但控制台中的最后三行,还是让我心凉了半截。错误仍然未能消灭。

从提示的错误信息来看,错误的根源还是来自于这个 Test.xml 文件,为此,我认真百度了一下有关 XML 的信息,发现自己手写的 Test.xml 文件还真存在问题: </xml> 多余了。

最终修正如下:

<?xml version="1.0" encoding="UTF-8"?>
	<parent>
		<child name="James">
			<age>10</age>
			<sex>male</sex>
		</child>
	</parent>


 

保存并运行,期待的结果终于出现了:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值