为了能演示解析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>
保存并运行,期待的结果终于出现了: