2011-02-04 5 views
1

私は条件に基づいて2つの値を取得する必要がある辞書/リストbalance_sign_dictを持っています。 これはソースXMLです。辞書/リストから値を解析する

<Value> 
<Signature>-873</Signature> 
<Amount>1501042000</Amount> 
</Value> 

以下のようなデータを解析したいと思います。 条件付きデータを解析する方法を教えてください(例えば、 "Signature"ノードの "Amount"ノードの値が-873の場合)1501042000

一般的な構文解析方法が必要です下の辞書からの値。 balance_sign_dictの

印刷の説明:ここでは

(
     { 
     nodeChildArray =   (
         { 
       nodeContent = "-873"; 
       nodeName = Signature; 
      }, 
         { 
       nodeContent = 1501042000; 
       nodeName = Amount; 
      } 
     ); 
     nodeName = Value; 
    }, 
     { 
     nodeChildArray =   (
         { 
       nodeContent = "-1228"; 
       nodeName = Signature; 
      }, 
         { 
       nodeContent = 428586000; 
       nodeName = Amount; 
      } 
     ); 
     nodeName = Value; 
    }, 
     { 
     nodeChildArray =   (
         { 
       nodeContent = "-1140"; 
       nodeName = Signature; 
      }, 
         { 
       nodeContent = 79370000; 
       nodeName = Amount; 
      } 
     ); 
     nodeName = Value; 
    }, 

は、私が今しようとしていますものです。

for (NSDictionary *valueNode in balance_sign_dict){ 
      for (NSArray *nodeChildArray in [valueNode objectForKey:@"nodeChildArray"]){ 
       NSString *tmpNodeName = [nodeChildArray objectAtIndex:1]; 
       NSDictionary *tmpD = [valueNode objectAtIndex:1]; 


       if ([tmpNodeName isEqualToString:@"Signature"]) { 
        tmpSignVal = [nodeChildArray objectAtIndex:0]; 
        if ([tmpSignVal isEqualToString:@"-873"]) { 
         tmpSignAmt = [nodeChildArray objectAtIndex:1]; 
        } 
       } 

何らかの理由でnodeChildArrayの2番目の部分が削除されます。 nodeContent = 1501042000; nodeName =金額。

その部分にアクセスする方法がわかりません。

助けてください。 }
}

実際には、代替実行中に取得するものです。 nodeChildArrayの

印刷記述: {タイプ=可変辞書、カウント= 2、 エントリ=> 0:{内容= "nodeNameの"} = {内容= "署名"} 1:{内容=「nodeContent 「} = {内容= "-1507" nodeChildArrayの} }

印刷記述: {タイプ=可変辞書、カウント= 2、 エントリは=> 0:{内容= "nodeNameの"} = {内容= "Amount"} 1:{contents = "nodeContent"} = {contents = "631000"} }

署名値と一致する金額の値はどのようにして取得できますか?

答えて

1

NSArrayおよびNSDictionaryは、経験したどの言語でもわかっているコンテナクラスの中で最も優れています。 NSDictionaryは、NSArrayを含む任意のオブジェクトまたはプリミティブを格納することができ、逆も同様です。私が辞書を言うと、どちらのクラスも恣意的に参照しています。

NSLog(@"%@",myDict);のような簡単な説明を出力すると、辞書全体の内容がXML(またはより正確にはJSON)のように表示されます。内部に含まれているかを決定するために、辞書の説明。()NSArray{}NSDictionaryを意味を表す。

// this is the beginning of an array. 
(
     // this is the beginning of index 0 of the array, an `NSDictionary` 
     { 
     // objectForKey:@"nodeChildArray"] isKindOfClass:[NSArray class]] 
     nodeChildArray =   (// inside nodeChildArray is another array 
         { // index 0 of array is a dictionary with two keys 
       // objectForKey:@"nodeContent" == @"-873" 
       nodeContent = "-873"; 
       // objectForKey:@"nodeName" == @"Signature" 
       nodeName = Signature; 
      }, // end of index 0 
         { // index 1 of array 
       nodeContent = 1501042000; 
       nodeName = Amount; 
      } // end of index 1 
     ); // end of nodeChildArray, an NSArray stored at objectForKey:@"nodeChildArray" 
     // this is the only other element in the dictionary, a string 
     // objectForKey:@"nodeName"] isKindOfClass:[NSString class]] 
     nodeName = Value; 
    }, // end of the dictionary containing nodeChildArray and nodeName 
     { // objectAtIndex:1 
     nodeChildArray =   (
         { 
       nodeContent = "-1228"; 
       nodeName = Signature; 
      }, 
         { 
       nodeContent = 428586000; 
       nodeName = Amount; 
      } 
     ); 
     nodeName = Value; 
    }, 
     { // objectAtIndex:2 
     nodeChildArray =   (
         { 
       nodeContent = "-1140"; 
       nodeName = Signature; 
      }, 
         { 
       nodeContent = 79370000; 
       nodeName = Amount; 
      } 
     ); 
     nodeName = Value; 
    }, 
); 

だから、あなたはそれが実際にNSArrayだあなたNSDictionaryデバッグ出力を見てから見ることができます。構造体の順序はNSArray->NSDictionary->NSArray->NSString <--> [[[[NSArray objectAtIndex:i] NSDictionary objectForKey:@"nodeChildArray"] NSArray objectAtIndex:j] NSDictionary objectForKey:@"nodeContent"]です、ついに復帰NSString。これを最新のコードとして使用してください。コードの最後のバージョンではbalance_sign_dictNSDictionaryとして渡しました。 これはうまくいっているかもしれません!しかし、引数を適切にキャストする方がはるかに良い形式です。辞書がNSArrayまたはNSDictionaryで始まるかどうかわからない場合は、idとしてキャストし、そのタイプを[theIdObject isKindOfClass:[{NSArray,NSDictionary} class]]で確認してください。 {}を使用せず、コード内の2つのうちの1つを選択してください。

-(NSDictionary*)parseBalance:(NSArray*)balance_sign_dict 
{ 
    NSMutableDictionary* theResults = [NSMutableDictionary dictionary]; 
    for(NSDictionary* nodeDict in balance_sign_dict) 
    { 
    NSArray* nodeChildArray = [nodeDict objectForKey:@"nodeChildArray"]; 
    [theResults addObject:[[nodeChildArray objectAtIndex:1] objectForKey:@"nodeContent"] forKey:[[nodeChildArray objectAtIndex:0] objectForKey:@"nodeContent"]]; 
    } 
    return theResults; 
} 
+0

ヘイトムソン...ありがとうございます。答えは、私が探しているもののラインに沿っているようです。 私はこの関数を使ってSignature のために渡されたものに基づいて値を返すことができますか? Signatureノードの値が-873の場合)1501042000 つまり、関数に "-873"というシグネチャを渡すと、返されます。1501042000 – testndtv

+0

@Thomson Comer:There nodeChildArrayの型に問題があるようです。実際には、配列ではなくdictを返すようです。私はデバッガをチェックインしました。その結果、まだ正しい結果が得られていません。 – testndtv

+0

hmthur、申し訳ありませんが、私のミスがどこにあるのか分かります。私は答えを更新し、それは今あなたが求めていることを行うはずです。 [myDict objectForKey:@ " - 873"]がbalance_sign_dictのすべての要素に対して1501042000を返すというNSDictionaryが返されます。 –

関連する問題