尝试在 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 服务响应转换为字典。从那里你可以解析数据......
- 将 fastest_object_to_dict 函数添加到文件顶部
- 进行网络服务调用
创建一个新变量来保存字典响应
result = client.service.adoptableSearchExtended('nunya', 0, 'A', 'All', 'N')
ParsedResponse = fastest_object_to_dict(result)
</pre>
您的数据现在将采用字典的形式,您可以根据需要在 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)
我正在努力寻找一种方法来解析我从 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 服务响应转换为字典。从那里你可以解析数据......
- 将 fastest_object_to_dict 函数添加到文件顶部
- 进行网络服务调用
创建一个新变量来保存字典响应
result = client.service.adoptableSearchExtended('nunya', 0, 'A', 'All', 'N') ParsedResponse = fastest_object_to_dict(result) </pre>
您的数据现在将采用字典的形式,您可以根据需要在 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)