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 获得的一些字符串的串联,所以没有有理由再次解析它。
我有一个函数可以发送获取请求并解析响应 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 获得的一些字符串的串联,所以没有有理由再次解析它。