试图在Python中解析SOAP响应

时间:2016-01-28 00:46:26

标签: python web-services soap suds

我很难找到一种方法来解析我从SOAP响应中获取的数据。我只熟悉Python(v3.4),但相对较新。我正在使用suds-jurko从第三方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到Photo的一组信息)。尝试修改这种方法可以为我提供所有内容,无需任何内容,或只提供最后一个节点。

然后我尝试使用ElementTree和简单的代码来测试它,但只得到“无效文件”错误。

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"
            }
      },

有人能让我指出正确的方向吗?

2 个答案:

答案 0 :(得分:0)

我在使用Python 3.4和suds-jurko解析来自Web服务的数据时遇到了类似的问题。我能够使用这篇文章中的代码https://stackoverflow.com/a/34844428/5874347来解决问题。我使用faster_object_to_dict函数将Web服务响应转换为字典。从那里你可以解析数据......

  1. 将faster_object_to_dict函数添加到文件顶部
  2. 拨打网络服务电话
  3. 创建一个新变量以保存字典响应

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

  4. 您的数据现在将以字典的形式存在,您可以根据需要解析python端的字典,或者通过json将其发送回您的ajax调用,并使用javascript解析它。 把它作为json发回

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

答案 1 :(得分:0)

请试试这个:

result[0][1][2]

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

y<-NULL
for(i in unique(infofile$family)){
  AGE<-infofile[infofile$family==i,]
  if(unique(AGE$age[i]> 60)){
    AGE$yearsold[i]<-"OLD"
  }else{AGE$yearsold[i]<-"YOUNG"}
  y<-rbind(y,AGE)
}

将为您提供元素结果[0] [1]的第三个元素。

希望这能提供另一种解决方案。