1

很抱歉问了一些愚蠢的问题,但我仍然遇到 Objective-C 语法的问题。所以,我从我的 sudzc.com 生成的代码中得到了这个 SOAP 响应。它应该包含一个带有veh_idversion作为列的 SQL SELECT 结果。

我作为响应对象得到的是一个 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?我必须先投吗?

这是从 Zend Soap-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 函数。由于我的 Soap 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;
    };
}
于 2012-06-09T18:20:39.503 回答