1

我正在尝试解析SOAP来自服务器的响应。我对SOAP使用HTTP/进行交流是 100% 的新手,而且非常陌生HTTPS。我在 Ubuntu 12.04 上使用 Python 2.7。

看起来SOAP很像XML。但是,我似乎无法解析它。我尝试使用ElementTree但不断出错。通过搜索,我可以得出结论,SOAP标签可能存在问题。(我可能会离开这里......如果我在,请告诉我。)

因此,这是我拥有的消息的示例SOAP以及我试图解析它的方法(如果相关,这是来自 Link Point Gateway 的实际服务器响应)。

import xml.etree.ElementTree as ET
soap_string = '<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Body><fdggwsapi:FDGGWSApiOrderResponse xmlns:fdggwsapi="http://secure.linkpt.net/fdggwsapi/schemas_us/fdggwsapi"><fdggwsapi:CommercialServiceProvider/><fdggwsapi:TransactionTime>Wed Jul 25 10:26:40 2012</fdggwsapi:TransactionTime><fdggwsapi:TransactionID/><fdggwsapi:ProcessorReferenceNumber/><fdggwsapi:ProcessorResponseMessage/><fdggwsapi:ErrorMessage>SGS-002303: Invalid credit card number.</fdggwsapi:ErrorMessage><fdggwsapi:OrderId>1</fdggwsapi:OrderId><fdggwsapi:ApprovalCode/><fdggwsapi:AVSResponse/><fdggwsapi:TDate/><fdggwsapi:TransactionResult>FAILED</fdggwsapi:TransactionResult><fdggwsapi:ProcessorResponseCode/><fdggwsapi:ProcessorApprovalCode/><fdggwsapi:CalculatedTax/><fdggwsapi:CalculatedShipping/><fdggwsapi:TransactionScore/><fdggwsapi:FraudAction/><fdggwsapi:AuthenticationResponseCode/></fdggwsapi:FDGGWSApiOrderResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>'
targetTree = ET.fromstring(soap_string)

这会产生以下错误:

unbound prefix: line 1, column 0

从另一个 stackoverflow帖子中,我得出结论,这SOAP-ENV:Body可能会导致命名空间问题。(我可能是错的。)

我已经进行了其他搜索以找到一个很好的解析解决方案,SOAP但其中大部分来自 3 年多以前。似乎强烈推荐suds 。我想在我走得太远之前获得“更新”的建议。

任何人都可以推荐一种可靠(且简单)的方法来解析SOAP我上面收到的响应吗?如果您能提供一个简单的示例来帮助我入门,将不胜感激(正如我上面所说,我对 完全陌生SOAP)。

4

2 回答 2

0

我找不到使用 Python 的直接方法。我决定改用 PHP。

很像以下内容:

Python:

import subprocess
command = 'php /path/to/script.php "{1}"'.format(soap_string)
process = subprocess.Popen(command, shell = True, stderr = subprocess.PIPE, stdout = subprocess.PIPE)
process.wait()
output = process.communicate()[0]
(error, result, order_id) = output.split(',')

PHP:

#!/usr/bin/php
<?php

$soap_response = $argv[1];

$doc = simplexml_load_string($soap_response);
$doc->registerXPathNamespace('fdggwsapi', 'http://secure.linkpt.net/fdggwsapi/schemas_us/fdggwsapi');
$nodes = $doc->xpath('//fdggwsapi:FDGGWSApiOrderResponse/fdggwsapi:ErrorMessage');
$error = strval($nodes[0]);

$nodes = $doc->xpath('//fdggwsapi:FDGGWSApiOrderResponse/fdggwsapi:TransactionResult');
$result = strval($nodes[0]);

$nodes = $doc->xpath('//fdggwsapi:FDGGWSApiOrderResponse/fdggwsapi:OrderId');
$order_id = strval($nodes[0]);

$array = array($error, $result, $order_id);
$response = implode(',', $array);

echo $response;

此代码仅解析此特定SOAP响应的特定方面。这应该足以让你解决你的问题。

当谈到 PHP 时,我是一个完全的新手(我使用过一点 Perl,所以这很有帮助)。我必须感谢@scoffey,因为他以最终对我有意义SOAP的方式进行解析的解决方案。

于 2012-07-25T21:34:29.097 回答
0

编辑:在 Python 中使用 SOAP 真的很有趣——大多数工具都没有维护多年。如果我们谈论功能 - 也许ZSI是领导者。但是如果要支持一些更复杂的 XSD 模式,它就会有很多错误(仅举一个例子——它不支持基于扩展的联合和复杂类型,其中扩展类型不是基本类型)。 Suds非常易于使用,但不如 ZSI 强大 - 它对一些复杂的 XSD 结构的支持比 ZSI 更差。有一个有趣的工具 - generateDS,它与 XSD 一起工作,而不是直接与 WSDL 一起工作 - 你必须自己实现这些方法。但它实际上做得很好。

于 2012-07-25T21:54:33.313 回答