Как получить доступ к полям массива в результате sudzc.com SOAP?

Извините, что, возможно, задал глупые вопросы, но у меня все еще есть проблемы с синтаксисом Objective-C. Итак, я получил этот SOAP-ответ от моего сгенерированного кода sudzc.com. Он должен содержать результат SQL SELECT с veh_id а также 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? Я должен разыграть это первым?

Вот строка XML, возвращенная с Zend Soap-сервера:

<?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>

2 ответа

Решение

Наконец-то нашел решение! Проблема заключается в функции deserializeAsDictionary. Поскольку моя строка XML в Soap структурирована так, что каждый столбец базы данных имеет элемент-ключ-значение-ключ-значение и т. Д., Он добавляет каждый столбец под ключом "элемент", и, таким образом, функция 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;
    };
}

Нет.. Вам не нужно приводить его, так как он показывает все извлеченные данные, я столкнулся с проблемой, что значение метода обработчика (типа 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);

}

Другие вопросы по тегам