为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存储。随着托管对象的进入和保存,结果控制器会更新表视图,并显示其获取的任何结果。
答
NSDictionary
的NSMutableArray
对于您的内存数据结构似乎是一种合理的方法。
你基本上有一个系列,通过你的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
委派),最后将其添加到阵列中。
你会还想在完成解析后在你的'UITableView'上调用'reloadData'。 – 2010-01-05 22:32:19
感谢您的建议 – PirosB3 2010-07-29 17:26:02