Python xml.ElementTree - return 函数在变量中解析 xml 以备后用

Python xml.ElementTree - function to return parsed xml in variable to be used later

我有一个函数可以发送获取请求并解析响应 xml:

def get_object(object_name):
    ...
    ...
    #parse xml file
    encoded_text = response.text.encode('utf-8', 'replace')
    root = ET.fromstring(encoded_text)
    tree = ET.ElementTree(root)
    return tree

然后我使用这个函数循环遍历列表中的对象以获取 xmls 并将它们存储在变量中:

jx_task_tree = ''
for jx in jx_tasks_lst:
    jx_task_tree += str(get_object(jx))

我不确定,函数 return 向我发送的数据是否正确 format/form 以便以后按我需要的方式使用它们。

当我想像这样解析变量 jx_task_tree 时:

parser = ET.XMLParser(encoding="utf-8")
print(type(jx_task_tree))
tree = ET.parse(jx_task_tree, parser=parser)
print(ET.tostring(tree))

它给我一个错误:

Traceback (most recent call last):
  File "import_uac_wf.py", line 59, in <module>
    tree = ET.parse(jx_task_tree, parser=parser)
  File "/usr/lib64/python2.7/xml/etree/ElementTree.py", line 1182, in 
parse
    tree.parse(source, parser)
  File "/usr/lib64/python2.7/xml/etree/ElementTree.py", line 647, in parse
    source = open(source, "rb")
IOError: [Errno 36] File name too long: 
'<xml.etree.ElementTree.ElementTree 
object at 0x7ff2607c8910>\n<xml.etree.ElementTree.ElementTree object at 
0x7ff2607e23d0>\n<xml.etree.ElementTree.ElementTree object at 
0x7ff2607ee4d0>\n<xml.etree.ElementTree.ElementTree object at 
0x7ff2607d8e90>\n<xml.etree.ElementTree.ElementTree object at 
0x7ff2607e2550>\n<xml.etree.ElementTree.ElementTree object at 
0x7ff2607889d0>\n<xml.etree.ElementTree.ElementTree object at 
0x7ff26079f3d0>\n'

有人能帮我吗,函数 get_object() return 应该是什么以及以后如何使用它,所以 returned 可以合并到一个变量中并进行解析?

关于您当前的异常:

根据[Python 3.Docs]: xml.etree.ElementTree.parse(source, parser=None)重点是我的):

Parses an XML section into an element tree. source is a filename or file object containing XML data.

如果要从字符串加载 XML,请改用 ET.fromstring

那么,正如您所怀疑的那样,第 2nd 个代码片段是完全错误的:

  • get_object(jx) returns 一个已经解析的 XML,所以一个 ElementTree 对象
  • 对其调用 str,将生成其文本表示(例如 "")这不是你想要的

你可以这样做:

jx_tasks_string = ""
for jx in jx_tasks_lst:
    jx_tasks_string += ET.tostring(get_object(jx).getroot())

因为 jx_tasks_string 是通过解析一些 XML blob 获得的一些字符串的串联,所以没有有理由再次解析它。