您好,登錄后才能下訂單哦!
以請求本地文件中的XML數(shù)據(jù)為例,說明iOS下如何用蘋果自帶類NSXMLParser解析XML數(shù)據(jù)。
本地文件students.xml中的數(shù)據(jù)格式如下:
<?xml version="1.0" encoding="UTF-8"?>
<AllStudents>
<message>StudentInfo</message>
<student>
<name>Tom</name>
<age>10</age>
<school>JiangSu University</school>
</student>
<student>
<name>James</name>
<age>22</age>
<school>NanJing University</school>
</student>
<student>
<name>John</name>
<age>23</age>
<school>HongKong University</school>
</student>
</AllStudents>
詳細解析步驟
.h文件
聲明代理:<NSXMLParserDelegate>
定義屬性:
@property(nonatomic,retain)NSString *currentValue;
@property(nonatomic,retain)NSMutableDictionary *messageDic;
@property(nonatomic,retain)NSMutableDictionary *studentInfoDic;
@property(nonatomic,retain)NSMutableArray *finalArray;
.m文件
@synthesize currentValue = _currentValue;
@synthesize messageDic = _messageDic;
@synthesize studentInfoDic = _studentInfoDic;
@synthesize finalArray = _finalArray;
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// 獲取xml文件的路徑
NSString*xmlPath=[[NSBundle mainBundle] pathForResource:@"students"ofType:@"xml"];
// 轉(zhuǎn)化為Data
NSData *data = [[NSData alloc] initWithContentsOfFile:xmlPath];
// 初始化
NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:data];
// 代理
xmlParser.delegate = self;
// 開始解析
BOOL flag = [xmlParser parse];
if (flag) {
NSLog(@"解析成功");
NSLog(@"self.finalArray = %@",_finalArray);
}
else{
NSLog(@"解析出錯");
}
[data release];
[xmlParser release];
}
//代理方法
//開始解析
-(void)parserDidStartDocument:(NSXMLParser *)parser
{
// 用數(shù)組存儲每一組信息
self.finalArray = [[[NSMutableArray alloc] init]autorelease];
}
//開始節(jié)點
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
if ([elementName isEqualToString:@"message"]) {
self.messageDic = nil;
self.messageDic = [[[NSMutableDictionary alloc] initWithCapacity:0]autorelease];
}
if ([elementName isEqualToString:@"student"]) {
self.studentInfoDic = nil;
self.studentInfoDic = [[[NSMutableDictionary alloc]initWithCapacity:1]autorelease];
}
}
//發(fā)現(xiàn)節(jié)點值時
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
self.currentValue = string;//currentValue暫存節(jié)點值
}
//結(jié)束節(jié)點時
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
if ([elementName isEqualToString:@"message"]) {
[self.messageDic setObject:_currentValue forKey:elementName];
//<message>元素存入數(shù)組
[self.finalArray addObject:_messageDic];
}
if ([elementName isEqualToString:@"name"]||
[elementName isEqualToString:@"age"]||
[elementName isEqualToString:@"school"])
{
//發(fā)現(xiàn)student的具體信息:age,name,school存入字典
[self.studentInfoDic setObject:_currentValue forKey:elementName];
}
if ([elementName isEqualToString:@"student"]) {
//<student>元素存入數(shù)組
[self.finalArray addObject:_studentInfoDic];
}
self.currentValue = @"";
}
最終的結(jié)果如下:
2014-06-02 14:03:02.104 XMLParser[5102:60b] 解析成功
2014-06-02 14:03:02.108 XMLParser[5102:60b] self.finalArray = (
{
message = StudentInfo;
},
{
age = 10;
name = Tom;
school = "JiangSu University";
},
{
age = 22;
name = James;
school = "NanJing University";
},
{
age = 23;
name = John;
school = "HongKong University";
}
)
以下總結(jié)來自:http://blog.csdn.net/like7xiaoben/article/details/7699965
注意:
解析xml數(shù)據(jù)的時候,
每當遇到元素節(jié)點的時候都會執(zhí)行didStartElement代理方法,如果有屬性節(jié)點,可以直接在這個方法中獲取屬性的值;
每當遇到文本節(jié)點的時候都會執(zhí)行foundCharacters代理方法,獲取文本節(jié)點中的值然后到didEndElement方法中進行區(qū)分。
如果是換行符的話也會獲取,因為換行符也是文本節(jié)點,不過當一個元素節(jié)點結(jié)束后的換行符是不會獲取的。
比如說: (換行符1)
<li>文本節(jié)點</li>
(換行符2)
元素節(jié)點前后各有一個換行符,這時只會獲取換行符1,而不會獲取換行符2。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。