2012-04-30 9 views
1

申し訳ありません、私はまだ愚かな質問をしていますが、Objective-Cの構文にはまだ問題があります。 私はsudzc.comが生成したコードからこのSOAP応答を得ました。これには、カラムとしてveh_idversionのSQL SELECT結果が含まれている必要があります。sudzc.comの配列フィールドにアクセスする方法SOAPの結果?

私は応答オブジェクトとして取得するので、私はそれを歩くNSMutableArrayの、

NSMutableArray* soapArray = (NSMutableArray*)value; 

さ:

myobj: { 
item =  { 
    key = version; 
    value = 1; 
}; 
:私は何をプリントアウトとして取得するようなものである

unsigned count = [soapArray count]; 
while (count--) { 
    id myobj = [soapArray objectAtIndex:count]; 
    NSLog(@"myobj: %@", myobj); 
} 

SQL結果の各行に対して

これが配列要素のプリントアウトである場合、なぜversion列だけで、veh_id列も存在しないのですか?

のオブジェクトmyobjのキーの値にアクセスするにはどうすればよいですか?それを最初にキャストしなければならないのですか?

文字列は、Zendのソープサーバから返されたXMLをだ

<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.[myurl].com/soap" xmlns:ns2="http://xml.apache.org/xml-soap" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><ns1:getActiveVehiclesResponse><return SOAP-ENC:arrayType="ns2:Map[23]" xsi:type="SOAP-ENC:Array"><item xsi:type="ns2:Map"><item><key xsi:type="xsd:string">veh_id</key><value xsi:type="xsd:string">1</value></item><item><key xsi:type="xsd:string">version</key><value xsi:type="xsd:string">1</value></item></item><item xsi:type="ns2:Map"><item><key xsi:type="xsd:string">veh_id</key><value xsi:type="xsd:string">3</value></item><item><key xsi:type="xsd:string">version</key><value xsi:type="xsd:string">1</value></item></item><item xsi:type="ns2:Map"><item><key xsi:type="xsd:string">veh_id</key><value xsi:type="xsd:string">4</value></item><item><key xsi:type="xsd:string">version</key><value xsi:type="xsd:string">1</value></item></item></return></ns1:getActiveVehiclesResponse></SOAP-ENV:Body></SOAP-ENV:Envelope> 

答えて

0

が最後に解決策を見つけました! 問題は、deserializeAsDictionary関数内にあります。 私のソープXML文字列が項目として、各データベース列を持つように構成されているので、 - キー - 値 - キー - 値など、それがキー「項目」の下で、各列が追加されますので、deserializeAsDictionary機能がラインに

[d setObject:v forKey:[child name]] 
を上書き

既に追加されたオブジェクト。最初のショットでは、私は「ITEM1、ITEM2 ..」列イテレータを追加し、現在の列を呼び出している(さらに最適化が必要になる場合があります):

// Deserializes the element in a dictionary. 
+(id)deserializeAsDictionary:(CXMLNode*)element { 
NSLog(@"deserializeAsDictionary = %@, children: %d", element.stringValue, [element childCount]); 

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

NSMutableDictionary* d = [NSMutableDictionary dictionary]; 
NSInteger i = 1; 
NSString *objKey; 
for(CXMLNode* child in [element children]) { 
    id v = [Soap deserialize:child]; 
    if(v == nil) { 
     v = [NSNull null]; 
    } else { 
     if([[child name] isEqualToString:@"(null)"]) { 
      objKey = [NSString stringWithFormat:@"%@",[child stringValue]]; 
     } else if([[child name] isEqualToString:@"key"] || [[child name] isEqualToString:@"value"]) { 
      objKey = [NSString stringWithFormat:@"%@",[child name]]; 
     } else { 
      objKey = [NSString stringWithFormat:@"%@%d",[child name],i++]; 
     } 

    } 

    [d setObject:v forKey:objKey]; 
    NSLog(@"child %@ added", objKey); 
} 
return d; 
} 

結果の配列は、今のようになります。

}, 
    { 
    item1 =   { 
     key = "veh_id"; 
     value = 29; 
    }; 
    item2 =   { 
     key = version; 
     value = 1; 
    }; 
} 
1

ありません..あなたはそれが、私はその問題に直面していた全てのデータフェッチを示しているので、それをキャストする必要はありませんハンドラ(id型の)メソッド値は、最初の要素のみを返します。次のコード

チェック: ...

request = [service myServiceCall:self action:@selector(myHandlerMethod:) param:param1];

...

}

-(void) myHandlerMethod:(id)value{

NSString *xmlString = [[NSString alloc] initWithData:request.receivedData encoding:NSUTF8StringEncoding]; // now if the "value" returned is type as some array of some object,then any arrays don't handle serialization of all the elements of the array it holds. The following code prints just outer tag. (e.g.)

NSLog("%@",xmlString);

}

+0

XML文字列はうまく見えます - どのハンドラメソッドについて話していますか? – Nachtkrapp

+0

サービスを呼び出すときに引数にセレクタとして指定するアクションです。そのアクションメソッドのパラメータはidで、型がカスタム配列型の場合は最初の要素のみ(またはなし)を表示します。上記の例を参照してください。 –

+0

その代わりに、完全な配列を返すために何を使うべきですか? – Nachtkrapp

関連する問題