编辑:最终,我希望将输出放在静态位置下,并且find元素应该相同。目前,我可以使用数组中的静态位置获取值,但是,基于标签进行搜索时,没有任何结果。
我是使用Python和XML的新手,正在碰壁,希望有人可以提供一些见识。我的任务是使用API到我们的一个应用程序中,以基于通过XML从另一个应用程序接收的数据注入一些自定义字段。其中一部分涉及使用所述API根据通用标识符查找内部标识符,并且我需要继续进行处理的值通过XML作为XML数据通过API发送回去。如果指定XML标签/值的绝对位置,则可以检索该值,但是当我尝试按标签名称进行搜索时,我会带回垃圾。我不确定自己在做什么错。我尝试使用etree.find,etree.findall,etree.findtext,但它们似乎都不起作用。下面是我一直在尝试的示例(带有一些修改以保护无辜者),以及我搜索时API返回的XML数据示例。
用于API请求的Python脚本:
import requests
import xml.etree.ElementTree as ET
PSExpData = s.get(URLpostvars, verify=False)
PSOrderXML = ET.fromstring(PSExpData.text)
PSOrderID = PSOrderXML[0][0].text
OrderIDElement = PSOrderXML.findtext("OrderID", namespaces="http://vendor.com/commissure/webservices/explorer/2010/06")
print (PSExpData.text)
print (f"Order ID from static position: {PSOrderID}")
print (f"Order ID from find element: {OrderIDElement}")
返回的XML数据示例
<ArrayOfOrderData xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://vendor.com/commissure/webservices/explorer/2010/06">
<OrderData>
<OrderID>15397</OrderID>
<ReportID>0</ReportID>
<Accession>T0000000</Accession>
<Site>SITE</Site>
<OrderDate>0001-01-01T00:00:00</OrderDate>
<Procedures>IMG3022</Procedures>
<Status>Scheduled</Status>
<Patient>LASTNAME, FIRSTNAME</Patient>
</OrderData>
</ArrayOfOrderData>
当我尝试执行上述操作时,python所说的...当我注释掉第30行以及打印行时,它在静态位置上正常工作:
Traceback (most recent call last):
File "findorder.py", line 30, in <module>
OrderIDElement = PSOrderXML.findtext("OrderID", namespaces="http://vendor.com/commissure/webservices/explorer/2010/06")
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/xml/etree/ElementPath.py", line 320, in findtext
elem = next(iterfind(elem, path, namespaces))
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/xml/etree/ElementPath.py", line 268, in iterfind
else tuple(sorted(namespaces.items())))
AttributeError: 'str' object has no attribute 'items'
我已经来回重复了几次,但我不确定哪里出了问题。我不确定这是否与我将XML作为HTTP响应重新获得并且需要以不同的方式处理事情有关,但任何帮助将不胜感激。