-1

Sudzcで生成されたコードは、逆シリアル化されたノードの辞書を上書きしています。NSLog(@ "子ノード:%@"、[[[element children] objectAtIndex:0] stringValue]);を使用する場合 通過するたびに正しいアイテムが書き出されます。コードで結果を取得しようとすると、最後の1つだけが使用可能になります(Jackson3)。私は何が間違っているのですか?

// Deserializes the element in a dictionary.
+(id)deserializeAsDictionary:(CXMLNode*)element {

if([element childCount] == 1) {
    CXMLNode* child = [[element children] objectAtIndex:0];
    if([child kind] == CXMLTextKind) 
    {
         NSLog(@"The Child Node: %@", [[[element children] objectAtIndex:0] stringValue]);
        return [[[element children] objectAtIndex:0] stringValue];

    }
}

NSMutableDictionary* d = [NSMutableDictionary dictionary];
for(CXMLNode* child in [element children]) {
    id v = [Soap deserialize:child];
    if(v == nil) { v = [NSNull null]; }
    [d setObject:v forKey:[child name]];
}
return d;
}

NSLog:

2012-04-19 14:13:07.802 Management[3043:10703] Hopefully Child: Allen
2012-04-19 14:13:07.803 Management[3043:10703] Hopefully Child: 1
2012-04-19 14:13:07.804 Management[3043:10703] Hopefully Child: John
2012-04-19 14:13:07.804 Management[3043:10703] Hopefully Child: 2
2012-04-19 14:13:07.805 Management[3043:10703] Hopefully Child: Jackson
2012-04-19 14:13:07.805 Management[3043:10703] Hopefully Child: 3

XML:

<TC diffgr:id="TC1" msdata:rowOrder="0">
 <CSHR_POS_NAME>Allen</CSHR_POS_NAME>                            
    <CSHR_NUM>66</CSHR_NUM>
</TC>

<TC diffgr:id="TC2" msdata:rowOrder="1">                                    
  <CSHR_POS_NAME>John</CSHR_POS_NAME>
    <CSHR_NUM>2</CSHR_NUM>
    </TC>

<TC diffgr:id="TC3" msdata:rowOrder="2">
<CSHR_POS_NAME>Jackson</CSHR_POS_NAME>
<CSHR_NUM>3</CSHR_NUM>
</TC>
4

5 に答える 5

2

解決済み(soap.mを変更):

[d setObject:v forKey:[child name]]; 
NSString* key = [child name]; 
id check = [d objectForKey:key]; 
if( check != nil ) { 

    NSInteger next = 1; 
    key = [NSString stringWithFormat:@"%@%d", [child name], next]; 
    check = [d objectForKey:key]; 
    while( check != nil ) { 

        next++; 
        key = [NSString stringWithFormat:@"%@%d", [child name], next]; 
        check = [d objectForKey:key]; 
    } 
    [d setObject:v forKey:key]; 
} 
[d setObject:v forKey:[child name]]; 
于 2012-04-24T13:35:53.807 に答える
1

十分な担当者ポイントを取得するとすぐになりますが、コードの始まりと終わりに気づきました

  [d setObject:v forKey:[child name]];

私にとっては最初の行を削除する必要があり、それで修正されたので、コードは次のようになります。

// Deserializes the element in a dictionary.
 +(id)deserializeAsDictionary:(CXMLNode*)element {

if([element childCount] == 1) {
    CXMLNode* child = [[element children] objectAtIndex:0];
    if([child kind] == CXMLTextKind) {            
    return [[[element children] objectAtIndex:0] stringValue];
    }
}   
NSMutableDictionary* d = [NSMutableDictionary dictionary];

for(CXMLNode* child in [element children]) {

id v = [Soap deserialize:child];
if(v == nil) { v = [NSNull null]; }

//[d setObject:v forKey:[child name]]; //seems to be duped (maybe my bad)
    //Extended by iDev on StackOverflow
    //http://stackoverflow.com/questions/10235496/sudzc-deserializeasdictionary-over-written-dictionary/10358458#10358458
    NSString* key = [child name]; 
    id check = [d objectForKey:key]; 
    if( check != nil ) {             
        NSInteger next = 1;             
        key = [NSString stringWithFormat:@"%@%04d", [child name], next];
        check = [d objectForKey:key]; 
        while( check != nil ) {                 
            next++; 
            key = [NSString stringWithFormat:@"%@%04d", [child name], next]; 
            check = [d objectForKey:key]; 
        } 
        [d setObject:v forKey:key]; 
    } 
    [d setObject:v forKey:[child name]]; 
    //End Extension
}
return d;

}

于 2012-05-02T01:36:05.447 に答える
1

elseブロックも入れる必要があることがわかりました。

if( check != nil ) {             
    NSInteger next = 1;             
    key = [NSString stringWithFormat:@"%@%04d", [child name], next];
    check = [d objectForKey:key]; 
    while( check != nil ) {                 
        next++; 
        key = [NSString stringWithFormat:@"%@%04d", [child name], next]; 
        check = [d objectForKey:key]; 
    } 
    [d setObject:v forKey:key]; 
} else {
    [d setObject:v forKey:[child name]];
}
//End Extension

そうしないと、setObjectが2回呼び出されるため、「d」の要素が上書きされます。

于 2012-08-01T09:27:44.243 に答える
0

修正をどのように適用したかわかりません。deserializeAsDictionaryのコード全体を置き換えますか、それともコードの最後に追加しますか?

コード行がどこにあるのかforループがあることを確認してください

  [d setObject:v forKey:[child name]];

が見つかったので、単純に拡張して、forループを閉じる代わりに、ここで拡張するだけだと思いますが、これは正しいですか?

于 2012-04-27T22:04:04.020 に答える
0

上記のコードで問題が発生していました-毎回最初のエントリを上書きしていました-つまり、4つのアイテムのリストを取得し、1番目と4番目が重複していました。

多くのステップスルーコード(再帰コードは好きではありません)を使い果たした後、私は自分が信じていることが問題であることに気づきました。

私のコードは次のとおりです。

    if( check != nil ) {
        NSInteger next = 1;
        key = [NSString stringWithFormat:@"%@%04d", [child name], next];
        check = [d objectForKey:key];
        while( check != nil ) {
            next++;
            key = [NSString stringWithFormat:@"%@%04d", [child name], next];
            check = [d objectForKey:key];
        }
        [d setObject:v forKey:key];  
    }
    else
    {
          [d setObject:v forKey:[child name]];
    }
于 2012-08-17T01:13:50.760 に答える