我很难找到一种方法来解析我从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"
}
},
有人能让我指出正确的方向吗?
答案 0 :(得分:0)
我在使用Python 3.4和suds-jurko解析来自Web服务的数据时遇到了类似的问题。我能够使用这篇文章中的代码https://stackoverflow.com/a/34844428/5874347来解决问题。我使用faster_object_to_dict函数将Web服务响应转换为字典。从那里你可以解析数据......
创建一个新变量以保存字典响应
result = client.service.adoptableSearchExtended('nunya', 0, 'A', 'All', 'N')
ParsedResponse = fastest_object_to_dict(result)
您的数据现在将以字典的形式存在,您可以根据需要解析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]的第三个元素。
希望这能提供另一种解决方案。