0

所以在这里我被困在今天早上我的小项目中最简单的部分(或者我是这么想的)。目标是构建一个简单的 XML 解析器,它获取他们遇到的每个元素并将其添加到一个字典中,该字典最终将保存 xml 的所有键/值对。

所以像这样的xml

<xml>
  <1stTag>text</1stTag>
  <2ndTag>some more text</2ndTag>
</xml>

最终会出现在具有 2 个键/值对的字典中:

{
1stTag:text;
2ndTag:some more text;
}

采用 NSXMLParser 框架,我认为我只需将每个遇到的元素和文本存储在变量 self.elementInProgress 和 self.textInProgress(都是 NSStrings)中。元素完成后,我会将这对添加到字典中。

所以这里是 .h 文件:

    @interface MSParser : NSObject <NSXMLParserDelegate> 
    {
        NSString *elementInProgress;
        NSString *textInProgress;
        NSMutableDictionary *parsedXMLDict;
    }
@property (nonatomic, retain) NSString *textInProgress;
@property (nonatomic, retain) NSString *elementInProgress;
@property (nonatomic, retain) NSMutableDictionary *parsedXMLDict;

以及实现文件中的相应函数:

@synthesize textInProgress, elementInProgress, parsedXMLDict;

- (void)parser:(NSXMLParser *)parser  didEndElement:(NSString *)elementName  namespaceURI:(NSString *)namespaceURI  qualifiedName:(NSString *)qName
{
    [self.parsedXMLDict setValue:self.textInProgress forKey:self.elementInProgress];
    NSLog(@"%@",[self.parsedXMLDict valueForKey:self.elementInProgress]);
}

现在,我在这里,难住我的 NSLog 返回 Null!我认为这很简单。我错过了什么?self.textInProgress 和 self.elementInProgress 都根据调试器正确填充。我可以将其追溯到我调用 setValue ForKey 的这一行,这又是根据文档,并且以前为我工作了不止一次。字典只是不接受值。根据文档,如果传递的 setValue 为 nil,它只会表现得有趣,这里不是……有什么想法吗?
一切看起来都不错,不是编译器错误或警告,它只是返回 Null。难过,就像我说的...

4

1 回答 1

1

在您的代码中的某个地方(可能在您的init方法中),您需要实例化一个 NSMutableDictionary 实例并将其分配给您的属性(或 ivar,如果您在您的 init 方法中)。像这样的东西:

parsedXMLDict = [[NSMutableDictionary alloc] init];

如果您使用返回自动释放对象的便利构造,则还需要保留。

parsedXMLDict = [[NSMutableDictionary dictionaryWithCapacity:10] retain];

无论哪种情况,请确保您在某处有相应的版本,可能在您的 dealloc 中。

如果您已经在执行上述操作,那么您可能已经在代码中较早地发布了 parsedXMLDict?寻找self.parsedXMLDict = nil在你的方法之前被调用的地方parser: didEndElement: ...

于 2010-10-02T13:25:06.740 回答