0

我目前正在开发一个软件来通过 iPhone 控制我的服务器的 aMule 状态,我创建了一个套接字,它会吐出应该被解析的 xml,但是因为 NSXMLParser 是事件驱动的,所以我在理解这方面有问题工作...我想到了这种类型的 XML 结构,如果您有更好的结构方法的想法,请告诉我!:D

<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>

我在想的是,因为我想把它放在一个表格视图中,很可能我需要一个 NSMutableArray,根据结果有很多 NSDictionaries,每个 dict 都应该是一个文件。你们有什么建议?我应该如何处理这种情况?

谢谢

4

3 回答 3

1

编写一个解析器类,当触发解析器回调事件时,将节点转换为 Core Data 托管对象并将它们保存到托管对象上下文中。

使用 anNSFetchedResultsController访问 Core Data 存储。当托管对象进入并被保存时,结果控制器会使用它获取的任何结果更新表视图。

于 2010-01-05T22:28:05.610 回答
1

对于您的内存数据结构,一个NSMutableArrayofNSDictionary似乎是一种合理的方法。

基本上,您将拥有一系列回调,这些回调在NSXMLParser您的 XML 文件中运行时构建该数组:

- (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.
    }
}

由于您的所有数据都在属性中返回,因此您可以这样做。foundCharacters否则,当文件的标签出现在委托中时,您需要存储文件并构建它(委托)最终将其添加到您的数组中didEndElement

于 2010-01-05T22:30:11.260 回答
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

于 2010-01-06T03:07:35.540 回答