2012-08-16 32 views
0

我有这样的回应:SudzC问题与SOAP关键字

<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

你是什么意思“我得到格式化的字符串”?问题或问题不是很清楚,请您重新说明一下吗?并且哪个不允许应用程序执行和执行部分也不清楚!你想要代码最终做什么? – doNotCheckMyBlog 2012-08-20 06:29:28

+0

我想要得到一个解决方案,当我的肥皂响应有一个字段名称,这是一个SOAP关键字。 – 2012-08-20 06:37:43

+0

WSDL是由您制作还是您有任何控制权?我有类似的问题,我们结束添加命名空间到“类似的命名元素”[见:http://www.w3schools.com/xml/xml_namespaces.asp] – doNotCheckMyBlog 2012-08-20 06:40:04

回答

2

// Deserialize an object as a generic object 
+ (id) deserialize: (CXMLNode*) element{ 

    // Get the type 
    NSString* type = [Soap getNodeValue:element withName:@"type"]; 

展望[肥皂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; 
} 

和肥皂替代它:反序列化:

// 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) { 

而且它完全适用于我,直到现在。希望它能帮助有相同情况的其他人。