溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

iOS開發(fā)-XML解析

發(fā)布時間:2020-07-08 18:55:18 來源:網(wǎng)絡(luò) 閱讀:952 作者:njrhero 欄目:移動開發(fā)

以請求本地文件中的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。

向AI問一下細節(jié)

免責聲明:本站發(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)容。

AI