2010-01-05 26 views
0

我目前正在研究通過iPhone控制我的服務器的aMule狀態的軟件, 我創建了一個吐出應該解析出來的xml的套接字,但是因爲NSXMLParser是事件驅動器,我在理解這可能如何工作有問題... 我想到了這種類型的XML結構,如果你有更好的方法來構建它的想法,請告訴我! :d爲iPhone解析XML(aMule下載/搜索結果)

<root type="donwloads"> <-- specifies downloads or search results 
<file name="Ubuntu_9_10.iso" status="[11,6%]" /> 
<file name="Fedora 12.iso" status="[56,2%]" /> 
</root> 

什麼,我當時的想法是,我想把這個在tableview中,最有可能我會需要一個NSMutableArray裏有很多成果的基礎上NSDictionaries,每字典應該是一個文件..什麼你們是否建議?我應該如何處理這種情況?

感謝

回答

1

非常感謝您的回答:D幸虧我解決了這個問題,10分鐘後:d 生病後我做了什麼:

XML:

<root> 
    <downloads> 
<file type="text" name="fdsdf" /> 
<file type="text" name="sdfsdfssds" /> 
    </downloads> 
</root> 

的NSXMLParser代表:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict{ 
if([elementName isEqualToString:@"downloads"] || [elementName isEqualToString:@"results"]){ 
    NSLog(@"starting or downloads or results"); 
    if(xmlArray){ 
     xmlArray= nil; 
    } 
    self.xmlArray= [[NSMutableArray alloc] init]; 
} 
else if([elementName isEqualToString:@"file"]){ 
    NSLog(@"found file..."); 
    [self.xmlArray addObject:attributeDict]; 
    } 
} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{ 
if([elementName isEqualToString:@"downloads"] || [elementName isEqualToString:@"results"]){ 
    if([elementName isEqualToString:@"downloads"]){ 
     NSLog(@"downloads found: %@... reloading table", xmlArray); 
    } 
    } 
} 

我希望這可以幫助有同樣問題的人:D

1

寫解析器類,輪流節點分成核心數據管理對象,並將它們保存到管理對象情況下,當一個解析器回調事件。

使用NSFetchedResultsController訪問Core Data存儲。隨着託管對象的進入和保存,結果控制器會更新表視圖,並顯示其獲取的任何結果。

1

NSDictionaryNSMutableArray對於您的內存數據結構似乎是一種合理的方法。

你基本上有一個系列,通過你的XML文件構建該數組爲NSXMLParser運行的回調:

- (void) parseXML:(NSString *) filename { 
    NSURL *xmlURL = [NSURL fileURLWithPath:filename]; 

    NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL]; 

    [xmlParser setDelegate:self]; 

    [xmlParser parse]; 

    // Check for errors. 
    NSError *errorCode = [xmlParser parserError]; 
    if (errorCode) { 
     // handle error here 
     NSLog(@"%@", [errorCode localizedDescription]); 
    } 

    [xmlParser release]; 
} 

而且你的主要代表人物:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict 
{ 
    // If certain elements are found initialize the object 
    if ([elementName isEqualToString:"@file"]) { 
     NSMutableDictionary *currentFile = [[NSMutableDictionary alloc] init]; 
     // Look through the attributes add stuff to your dictionary 
     // Add it to your array. 
    } 
} 

由於所有數據返回屬性,你可以這樣做。否則,當didEndElement委託中的文件標籤出現時,您需要存儲文件並將其構建(foundCharacters委派),最後將其添加到陣列中。

+0

你會還想在完成解析後在你的'UITableView'上調用'reloadData'。 – 2010-01-05 22:32:19

+0

感謝您的建議 – PirosB3 2010-07-29 17:26:02