尝试在 Python 中解析 SOAP 响应

Trying to Parse SOAP Response in Python

我正在努力寻找一种方法来解析我从 SOAP 响应返回的数据。我只熟悉 Python (v3.4),但相对较新。我正在使用 suds-jurko 从第 3 方 SOAP 服务器中提取数据。响应以 "ArrayOfXmlNode" 的形式返回。我试过以不同的方式使用 ElementTree 来解析数据,但我要么得不到任何信息,要么得到 "TypeError: invalid file: (ArrayOfXmlNode)" 错误。谷歌搜索如何处理 ArrayOfXMLNode 类型的响应让我一无所获。

SOAP 响应的第一部分是:

(ArrayOfXmlNode){
   XmlNode[] = 
      (XmlNode){
         Hl = 
            (Hl){
               ID = "22437790"
               Name = "Cameron"
               SpeciesID = "1"
               Sex = "Male"
               PrimaryBreed = "German Shepherd"
               SecondaryBreed = "Mix"
               SN = ""
               Age = "35"
               OnHold = "No"
               Location = "Foster Home"
               BehaviorResult = ""
               Photo = "http://sms.petpoint.com/sms/photos/615/123.jpg"
            }
      },

我尝试使用类似于以下的代码遍历数据:

from suds.client import Client
url = 'http://qag.petpoint.com/webservices/AdoptableSearch.asmx?WSDL'
client = Client(url)


result = client.service.adoptableSearchExtended('nunya', 0, 'A', 'All', 'N')

tree = result[0]

for node in tree:
    pet_info = []
    pet_info.extend(node)    

print(pet_info)

上面的代码在 "result[0]" 中给出了完整的响应。在此之下,我尝试从数据创建一个列表,但只得到最后一个节点(节点是从 ID 到照片的一组信息)。尝试修改这种方法要么给我所有东西,要么什么都没有,要么只给我最后一个节点。

于是我尝试用简单的代码使用 ElementTree 来测试它,但只得到 "invalid file" 错误。

import xml.etree.ElementTree as ET

from suds.client import Client
url = 'http://qag.petpoint.com/webservices/AdoptableSearch.asmx?WSDL'
client = Client(url)


result = client.service.adoptableSearchExtended('nunya', 0, 'A', 'All', 'N')

pet_info = ET.parse(result)
print(pet_info)

结果:

Traceback (most recent call last):
  File "D:\Python\Eclipse Workspace\KivyTest\src\root\nested\Parse.py", line 11, in <module>
    pet_info = ET.parse(result)
  File "D:\Programs\Python34\lib\xml\etree\ElementTree.py", line 1186, in parse
    tree.parse(source, parser)
  File "D:\Programs\Python34\lib\xml\etree\ElementTree.py", line 587, in parse
    source = open(source, "rb")
TypeError: invalid file: (ArrayOfXmlNode){
   XmlNode[] = 
      (XmlNode){
         Hl = 
            (Hl){
               ID = "20840097"
               Name = "Daisy"
               SpeciesID = "1"
               Sex = "Female"
               PrimaryBreed = "Terrier, Pit Bull"
               SecondaryBreed = ""
               SN = ""
               Age = "42"
               OnHold = "No"
               Location = "Dog Adoption"
               BehaviorResult = ""
               Photo = "http://sms.petpoint.com/sms/photos/615/40f428de-c015-4334-9101-89c707383817.jpg"
            }
      },

谁能帮我指出正确的方向?

我在使用 Python 3.4 和 suds-jurko 解析来自网络服务的数据时遇到了类似的问题。我能够使用 post、 中的代码解决问题。我使用 fastest_object_to_dict 函数将 Web 服务响应转换为字典。从那里你可以解析数据......

  1. 将 fastest_object_to_dict 函数添加到文件顶部
  2. 进行网络服务调用
  3. 创建一个新变量来保存字典响应

    result = client.service.adoptableSearchExtended('nunya', 0, 'A', 'All', 'N') 
    ParsedResponse = fastest_object_to_dict(result)
    </pre>

  4. 您的数据现在将采用字典的形式,您可以根据需要在 python 端解析字典或通过以下方式将其发送回您的 ajax 调用json,用javascript解析。 将其发送回 json

    import json
    import sys
    sys.stdout.write("content-type: text/json\r\n\r\n") 
    sys.stdout.write(json.dumps(ParsedReponse))
    </pre>

请试试这个:

result[0][0]

这将为您提供数组的第一个元素 (ArrayOfXmlNode)。 同样,试试这个:

result[0][1][2]

这将为您提供元素 result[0][1].

的第三个元素

希望这提供了替代解决方案。

如果您正在使用 Python,您可以从 XML 结果中解析此结果 JSON。
但是您的 SOAP 结果需要是 XML 输出,您可以在 suds 库上使用 retxml=True。

我也需要这个结果作为 JSON 输出,最后我这样解决了:

import xmltodict

# Parse the XML result into dict
data_dict = xmltodict.parse(soap_response)

# Dump the dict result into a JSON result
json_data = json.dumps(data_dict)
    
# Load the JSON string result
json = json.loads(json_data)