Objective C - sudzc,返回空的ArrayOfString,但xml响应包含数据

时间:2012-02-08 14:58:50

标签: objective-c web-services soap webservice-client

我是Objective C的新手。我正在尝试使用sudcz来使用web服务。 我已经用PHP创建了Webservice服务器和MySQL,现在我想与服务器通信并获得相关结果。

调用方法时,我从服务器获得了相应的XML响应,但返回的ArrayOfString类型的对象似乎是空的。 NSLog只打印< ArrayOfString>< / ArrayOfString&gt ;,我假设sudzc不是要将xml解析为aproporiate形式,因此返回的对象是空的,我错了吗?或者我只是无法看到或应对返回的物体?有人有任何线索吗?

如果需要任何材料,我会发布它们。 谢谢。

补充:

    CXMLElementNode* element = [[Soap getNode: [doc rootElement] withName: @"Body"] childAtIndex:0];
    if(deserializeTo == nil) {

        output = [Soap deserialize:element];

    } else {
                    NSLog(@"Deserialize to : %@", deserializeTo);
        if([deserializeTo respondsToSelector: @selector(initWithNode:)]) 
                            //problematic section
                            element = [element childAtIndex:0];
                            NSLog(@"NSSstring element : %@", element);
            output = [deserializeTo initWithNode: element];

                  } else {

            NSString* value = [[[element childAtIndex:0] childAtIndex:0] stringValue];
                            NSLog(@"NSSstring value : %@", value);
            output = [Soap convert: value toType: deserializeTo];
        }
           NSLog(@"output : %@", output);
    }

我认为有问题的部分是我推荐评论有问题的部分。因为object元素是xml元素,并且在调用output = [deserializeTo initWithNode:element]之后没有任何反应,NSLog(输出)在调用消息initWithNode之前打印与打印的NSLog(deserializeTo)相同的输出:object on object deserializeTo 我怀疑SoapObject实例方法initWithNode它不能正常工作,因为 我的deserializeTo是类RSiArrayOfstring的实例,该类是SoapObject的子集,它将此消息委托给父类(SoapObject),并且SoapObject中此消息的实现是:

// Called when initializing the object from a node
- (id) initWithNode: (CXMLNode*) node {
    if(self = [self init]) {
    }
    return self;
}

我看不到任何与参数节点

的操作

执行此代码时从调试器输出:

2012-02-08 20:22:03.166 URS[1170:b603] Deserialize to : <ArrayOfstring></ArrayOfstring>
2012-02-08 20:23:17.258 URS[1170:b603] NSSstring element : &lt;CXMLElement 0x5d7b920 [0x59701b0] return &lt;return arrayType="SOAP-ENC:Array[6]" type="SOAP-ENC:Array">&lt; item arrayType="xsd:string[1]" type="SOAP-ENC:Array">&lt; item type="xsd:string">1 - Elektroúdržba&lt;/item>&lt; /item>&lt; item arrayType="xsd:string[1]" type="SOAP-ENC:Array">&lt; item type="xsd:string">2 - Zámočnícka dielňa&lt; /item>&lt; /item>&lt; item arrayType="xsd:string[1]" type="SOAP-ENC:Array">&lt; item type="xsd:string">3 - Údržba žeriavov</item>&lt; /item>&lt; item arrayType="xsd:string[1]" type="SOAP-ENC:Array">&lt; item type="xsd:string">6 - Zámočnícká dielňa H4&lt; /item>&lt; /item>&lt; item arrayType="xsd:string[1]" type="SOAP-ENC:Array">&lt; item type="xsd:string">4 - Mechanici&lt; /item>&lt; /item>&lt; item arrayType="xsd:string[1]" type="SOAP-ENC:Array">&lt; item type="xsd:string">5 - Údržba CNC&lt; /item>&lt; /item>&lt; /return>>
2012-02-08 20:56:11.353 URS[1170:b603] output : &lt; ArrayOfstring>&lt; /ArrayOfstring 

1 个答案:

答案 0 :(得分:2)

您好我刚遇到同样的问题。

我找到了

[[Soap getNode: [doc rootElement] withName: @"Body"]

省略了标签的命名空间。所以在我的例子中,XML部分看起来像这样:

<SOAP-ENV:Body>....

将上述行更改为:

[[Soap getNode: [doc rootElement] withName: @"SOAP-ENV:Body"]

在我的案例中有所帮助。尽管我不确定命名空间是否因不同的soap实现而有所不同。

喝彩!