0


0

私はNSXMLParserを使ってリモートサーバーからのXMLデータを解析しています。 私は立ち上がって実行するために このチュートリアルをたどり、私が自分のオブジェクトに持っている(NSString *)メンバーなら誰でも大丈夫です。作成しています。 また、XMLデータから設定する必要がある整数もあります。

こんにちは123ワールド456

この場合、2つの「子」オブジェクトを作成します。 私が使っている:

-  (void)パーサー:(NSXMLParser *)パーサーdidEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI修飾名:(NSString *)qName {... [aChild setValue:currentElementValue forKey:elementName]; ... }

値を設定するために委任します。 これは私が私の問題に到達するところです。 "NSString * name"メンバは毎回うまく設定されていますが、NSIntegerを使用している場合は、 "number"を設定しようとするたびにEXC_BAD_ACCESSが返されます。 だから私は代わりに "int"を使ってみた。 しかし、今私はキーバリュープログラミングを使用することはできず、手動でノードを探す必要があります。

if([elementName isEqualToString:@ "number"]){aChild.number = [currentElementValue intValue]}

これは問題ありません。どのノードを取得するかがわかっているため、対処できますが、悪化します。 チュートリアルのとおりcurrentElementValueが "NSMutableString *"の場合、文字列が正しい場合でも正しい整数を返しません。 例えば:

NSLog(@ "NSMutableString値:%@、およびintValue%d \ n"、currentElementValue、[currentElementValue intValue]);
// Value will be 123 but intValue will be 0

そのため、currentElementValueをNSMutableStringではなくNSStringにしたので、適切なintValueを取得できます。 しかし、私がオンラインで読んだのは、それがNSMutableStringである理由は、

-  (void)パーサー:(NSXMLParser *)パーサーfoundCharacters:(NSString *)文字列

値_can_を設定するために使用されていたデリゲートが複数回出現しますが、通常は発生しません。 だから私の質問は誰が私が間違っていることを知っていますか? これはNSXMLParserにとってはごく簡単なケースのように思えるので、私はそれが私が誤解しているものだと確信しています。

あなたの助けをありがとう、何かがより明確になる必要があるならば私に知らせてください。

3 Answer


2


私はあなたのコードがどこで失敗しているのかわかりません、しかしこれはこれを扱うための正しい方法です:

NSMutableString * buffer = [[NSMutableString alloc] init];

-  (void)パーサ:(NSXMLParser *)パーサ}

-  (void)パーサ:(NSXMLParser *)パーサdidEndElement:(NSString *)elementName namespaceURI:(NSString *)qName {if([elementName isEqualToString:@ "number"]){{aChild setNumber:[ buffer intValue]]; [buffer setString:@ ""]; }}

-  (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {[バッファappendString:文字列]; }


2


  1. + intValue +`は同様に動作するはずです `+ NSString +`と `+ NSMutableString +。 値が '\ n123’ではなく '123'(\ nは改行文字を意味します)で、文字列が10進数で始まらない場合、 `+ intValue +`は0を返します。

  2. で可変文字列を正しくクリアしていますか + parser:didStartElement:+? `+ parser:didEndElement:`のみでクリーニングしている場合、 ` parser:foundCharacters:`は親要素からも文字を収集します。 この場合、文字列の先頭に改行が付き、 ` intValue +`は0を返します。

  3. あなたは `+ parser:foundCharacters:+`を呼び出すことができるという点で正しいです 単一の要素に対して複数回。


1


ここで起こっているカップルのこと。

まず、XML文字データに明らかな空白があります。

         456

あなたは本当にその空白を取り除くべきです。 それが、 `+ [NSString intValue] +`の戻り値が間違っている原因です。 あなたがソースでそれを削除することができれば、素晴らしいです。 そうでない場合は、次のようにして受信側でそれを取り除くことができます。

currentElementValue = [currentElementValue stringByTrimmingCharactersInSet:
    [NSCharacterSet whitespaceAndNewlineCharacterSet]];

キー/値を使用できなかった理由は、NSMutableDictionaryにNSInteger値を格納できないためです。 辞書のキーも値もNS​​Objectから派生する必要があります。NSIntegerは(ここでは推測していますが)プラットフォームセーフなintのtypedefです。 それであなたは代わりにNSNumberを使うべきです:

NSNumber *theInt = [NSNumber numberWithInt:[currentElementValue intValue]];
[aChild setObject:theInt forKey:elementName];