为iPhone解析XML(aMule下载/搜索结果)

为iPhone解析XML(aMule下载/搜索结果)

问题描述:

我目前正在研究通过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,每字典应该是一个文件..什么你们是否建议?我应该如何处理这种情况?

感谢

非常感谢您的回答: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

写解析器类,轮流节点分成核心数据管理对象,并将它们保存到管理对象情况下,当一个解析器回调事件。

使用NSFetchedResultsController访问Core Data存储。随着托管对象的进入和保存,结果控制器会更新表视图,并显示其获取的任何结果。

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