根据标签而不是绝对位置在XML中查找值

时间:2019-02-04 14:12:04

标签: python xml xml-namespaces

编辑:最终,我希望将输出放在静态位置下,并且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响应重新获得并且需要以不同的方式处理事情有关,但任何帮助将不胜感激。

0 个答案:

没有答案