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の両方が、デバッガーに従って正しく入力されます。私はそれをこの行までたどることができます。ここでsetValueForKeyを呼び出します。これもドキュメントに従っており、以前に何度も機能しました。辞書は値を取りません。ドキュメントによると、渡されたsetValueがnilの場合、それはおかしな動作をするだけですが、ここではそうではありません...何かアイデアはありますか?
コンパイラのエラーや警告ではなく、すべて良さそうです。Nullを返すだけです。私が言ったように、困惑しました...

4

1 に答える 1

1

コードのどこか(おそらくinitメソッド内)で、NSMutableDictionaryインスタンスをインスタンス化し、それをプロパティ(または、initメソッドを使用している場合はivar)に割り当てる必要があります。このようなもの:

parsedXMLDict = [[NSMutableDictionary alloc] init];

自動解放されたオブジェクトを返す便利な構造を使用している場合は、保持も必要になります。

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

いずれの場合も、対応するリリースがどこかにあることを確認してください。おそらく、deallocにあります。

すでに上記を実行している場合は、コードの前半でparsedXMLDictをすでにリリースしている可能性がありますか?self.parsedXMLDict = nilメソッドの前に呼び出されている、呼び出している場所を探しますparser: didEndElement: ...

于 2010-10-02T13:25:06.740 に答える