1

ばかげた質問をするのは申し訳ありませんが、Objective-Cの構文にまだ問題があります。したがって、sudzc.comで生成されたコードからこのSOAP応答を取得しました。veh_id列としておよび列としてSQLSELECT結果が含まれている必要がありversionます。

応答オブジェクトとして取得するのはNSMutableArrayです。

NSMutableArray* soapArray = (NSMutableArray*)value;

だから私はそれを歩きます:

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

私がプリントアウトとして得るものは次のようなものです:

myobj: {
item =     {
    key = version;
    value = 1;
};

SQL結果の各行に対して。これが配列要素のプリントアウトである場合、なぜ列だけがあり、version列もないのveh_idですか?

myobjタイプのオブジェクトのキーの値にアクセスするにはどうすればよいidですか?最初にキャストする必要がありますか?

これは、ZendSoap-Serverから返される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>
4

2 に答える 2

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);

}

于 2012-05-02T13:39:04.327 に答える
0

ついに解決策を見つけました!問題はdeserializeAsDictionary関数にあります。私のSoapxml文字列は、各データベース列がitem-key-value-key-valueなどになるように構成されているため、キー「item」の下に各列が追加され、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;
    };
}
于 2012-06-09T18:20:39.503 に答える