所以在这里,我被困在今天早上我的小项目最简单的部分(或者我想到的)。目标是构建一个简单的XML Parser,它接受他们遇到的每个元素并将其添加到最终将保存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为零,这里不是......任何想法?
一切看起来都不错,不是编译器错误或警告,它只返回Null。难倒,正如我所说......
答案 0 :(得分:1)
在代码中的某处(可能在您的init
方法中),您需要实例化NSMutableDictionary实例并将其分配给您的属性(如果您使用的是init方法,则将其分配给ivar)。像这样:
parsedXMLDict = [[NSMutableDictionary alloc] init];
如果您正在使用返回自动释放对象的便利构造,那么您还需要保留。
parsedXMLDict = [[NSMutableDictionary dictionaryWithCapacity:10] retain];
在任何一种情况下,请确保您的某个地方有相应的版本,可能在您的dealloc中。
如果您已经在执行上述操作,那么您可能已经在代码中早先发布了parsedXMLDict?在self.parsedXMLDict = nil
方法之前,查找要调用parser: didEndElement: ...
的地方。