Python xml.ElementTree - функция для возврата разобранного xml в переменную, которая будет использоваться позже - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть функция, которая отправляет запрос на получение и анализ ответа в 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))

Я не уверен, если функция возвращает мне данные в правильном формате / форме, чтобы использовать их позже, как мне нужно.

Когда я хочу проанализировать переменную 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 () возвращает и как с ней работать позже, чтобы возвращаемое можно было объединить в одну переменнуюа разобрали?

1 Ответ

1 голос
/ 26 апреля 2019

Относительно вашего текущего исключения:

Согласно [Python 3.Docs]: xml.etree.ElementTree. parse ( source, parser = None ) ( выделение принадлежит мне):

Разбирает секцию XML в дерево элементов. source - это имя файла или файловый объект , содержащий данные XML.

Если вы хотите загрузить XML из строки, используйтеET.fromstring вместо.

Тогда, как вы и подозревали, фрагмент кода 2 nd совершенно неверен:

  • get_object(jx) возвращает уже проанализированный 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-объектов нет причин для повторного анализа.

...