我有这样的回应:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:SurfaceElementListResponse xmlns:ns2="http://isiows.isiom.fr/schema/DmdCreation" xmlns:ns3="http://isiows.isiom.fr/schema/Error" xmlns:ns4="http://isiows.isiom.fr/schema/DmdDetail">
<SurfaceElementListResult>
<idSurfaceElement>9482</idSurfaceElement>
<name>R04-</name>
<type>NIVEAU</type>
</SurfaceElementListResult>
<SurfaceElementListResult>
<idSurfaceElement>9486</idSurfaceElement>
<name>Zone A</name>
<type>ZONE</type>
</SurfaceElementListResult>
</ns2:SurfaceElementListResponse>
</soap:Body>
</soap:Envelope>
我正在等待每个对象被反序列化为NSDictionary,因为它适用于除上面的一个之外的所有其他WS响应。
与其他响应相比,在SOAP.m:+ (id) deserialize: (CXMLNode*) element
方法中,语句NSString* type = [Soap getNodeValue:element withName:@"type"];
的所有响应都返回nil,因此它将继续返回[Soap deserializeAsDictionary:element];
并获得必要的结果。
在我的情况下,当我到达NSString* type = [Soap getNodeValue:element withName:@"type"];
时,语句返回第一个对象的“NIVEAU”和另一个对象的“ZONE”,这不允许应用程序执行[Soap deserializeAsDictionary:element];
并得到一个字符串对象而不是NSDictionary作为解析结果。
你能帮我解决这个问题吗?
答案 0 :(得分:2)
在
// Deserialize an object as a generic object
+ (id) deserialize: (CXMLNode*) element{
// Get the type
NSString* type = [Soap getNodeValue:element withName:@"type"];
查看[Soap getNodeValue] ...我想通了,这个函数的使用相当普遍。它用于获取字段的属性,作为字段的值。
// Gets the value of a named node from a parent node.
+ (NSString*) getNodeValue: (CXMLNode*) node withName: (NSString*) name {
// Set up the variables
if(node == nil || name == nil) { return nil; }
CXMLNode* child = nil;
// If it's an attribute get it
if([node isKindOfClass: [CXMLElement class]])
{
child = [(CXMLElement*)node attributeForName: name];
if(child != nil) {
return [child stringValue];
}
}
// Otherwise get the first element
child = [Soap getNode: node withName: name];
if(child != nil) {
return [child stringValue];
}
return nil;
}
在这种护理中,我创建了一个只获取属性值的新方法:
// Gets the value of a node attribute
+ (NSString*) getNodeAttributeValue: (CXMLNode*) node withName: (NSString*) name{
// Set up the variables
if(node == nil || name == nil) { return nil; }
CXMLNode* child = nil;
// If it's an attribute get it
if([node isKindOfClass: [CXMLElement class]])
{
child = [(CXMLElement*)node attributeForName: name];
if(child != nil) {
return [child stringValue];
}
}
return nil;
}
并将其替换为Soap:deserialize:
// Deserialize an object as a generic object
+ (id) deserialize: (CXMLNode*) element{
// Get the type
NSString* type = [Soap getNodeAttributeValue:element withName:@"type"];
// NSString* type = [Soap getNodeValue:element withName:@"type"];
if(type == nil || type.length == 0) {
直到现在,它对我来说都很完美。希望它能帮助处于相同情况的其他人。