2010-11-07 76 views
2

我正在解析XML文件並填充表視圖。該XML有這樣的格式:如何使用NSXMLParser解析多個XML標記

<article> 
    <title>Title 1</title> 
    <last-modified>MM/DD/YYY</last-modified> 
</article> 
... 

我現在有工作用NSMutableString收集所有的文章標題,並附加在- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string方法中的字符串。然後在適當的時候,我將articleTitle添加到包含所有文章標題的NSMutableArray,並按照您的預期填充陣列中的表格。

但是,現在我想切換到使用帶有小標題的表格視圖單元格(我想將最後修改日期作爲detailTextLabel,標題作爲textLabel)。通過這種方式,解析被分成幾種方法(即2 parser方法和foundCharacters方法),我不知道應該如何去「收集」數據,並從數據中填充表格。

這是最好的方法是什麼?我可以以某種方式填充一個NSDictionary或其他東西,並只建立了表格單元格時按鍵檢索項目?

我似乎無法找出解決這個問題的最佳方法。

在此先感謝!

+0

事件驅動的XML解析是一種跳動,如果存在可用的DOM樣式解析器,則從這裏開始。 – 2010-11-07 19:04:09

回答

5

如果你喜歡,你可以使用DOM解析器,它可能會讓你的生活變得更簡單,但如果由於某種原因你想堅持使用NSXMLParser,請繼續閱讀。

您希望將解析器的對象作爲您的委託(實現NSXMLParserDelegate的對象)在交付數據時基本累積數據。

重要細節通常覆蓋:對於各種標籤的「內容」,您實際上可以接收多個parser:foundCharacters:的電話。解析器絕對沒有要求立即將它全部交給你。如果它想,它可以一次給你一個角色,你必須妥善處理它。

以下假定以下實例變量:

NSMutableArray articles_; 
NSMutableString currentCharacters_; 
Article currentArticle_; // Article has title and lastModified properties. 

而這裏的代表如何執行的一些相關消息的樣品(以下代碼顯然沒有錯誤處理):

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { 
    if ([elementName isEqualToString:@"article"]) { 
     NSAssert(currentArticle_ == nil, @"Uh oh! Bad XML!"); 
     currentArticle_ = [[Article alloc] init]; 
     return; 
    } 
    if ([elementName isEqualToString:@"title"]) { 
     NSAssert(currentCharacters_ == nil, @"Uh oh! Bad XML!"); 
     currentCharacters_ = [[NSMutableString alloc] init]; 
     return; 
    } 
    if ([elementName isEqualToString:@"last-modified"]) { 
     NSAssert(currentCharacters_ == nil, @"Uh oh! Bad XML!"); 
     currentCharacters_ = [[NSMutableString alloc] init]; 
     return; 
    } 
} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 
    if ([elementName isEqualToString:@"article"]) { 
     [articles_ addObject:currentArticle_]; 
     [currentArticle_ release], currentArticle_ = nil; 
     return; 
    } 
    if ([elementName isEqualToString:@"title"]) { 
     currentArticle_.title = currentCharacters_; 
     [currentCharacters_ release], currentCharacters_ = nil; 
     return; 
    } 
    if ([elementName isEqualToString:@"last-modified"]) { 
     [currentArticle_ setLastModifiedWithString:currentCharacters_]; 
     [currentCharacters_ release], currentCharacters_ = nil; 
     return; 
    } 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
    [currentCharacters_ appendString:string]; 
} 
+0

完美,正是我需要的!謝謝。 – rpheath 2010-11-07 20:59:29

+1

如果這正是你所需要的,隨時接受答案。 ;) – imaginaryboy 2010-11-08 02:39:03

0

我的用戶DOM解析器,它是清潔的,如果你不解析的容易得多touchXML數據..建議谷歌的GDATA

這裏是它StackOverflow Questioň

NSError *error; 
GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:xmlData options:0 error:&error]; 
if (doc == nil) { return nil; } 

// get number of hits 
GDataXMLElement * article = [[doc nodesForXPath:@"//article" error:nil] objectAtIndex:0]; 

// title 
NSLog([[[entry elementsForName:@"title"] objectAtIndex:0] stringValue]], nil); 

// last-modified 
NSLog([[[entry elementsForName:@"last-modified"] objectAtIndex:0] stringValue]], nil);