SOAP关键字的SudzC问题

时间:2012-08-16 14:49:17

标签: iphone ios soap sudzc

我有这样的回应:

<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作为解析结果。

你能帮我解决这个问题吗?

1 个答案:

答案 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) {

直到现在,它对我来说都很完美。希望它能帮助处于相同情况的其他人。