Python elementtree проблемы с записью в файл - PullRequest
0 голосов
/ 22 мая 2019

Привет, я довольно новичок в python, здесь у меня есть код, с которым я долго боролся:

#listing all objects
if object_type != 'virtual':
    object_rt_lst = req_lib.list_objects(object_type).getroot()
else:
    object_rt_lst = req_lib.list_virtuals().getroot()

#name of generated file
xmlNm = syscode+'-'+object_type+'.xml'

#composing path
finalpath = os.path.join(output_path, xmlNm)

if object_type == 'virtual':
    object_type = 'virtualResource'

#base structure of xml tree for all objects
base_tree = '''
<UACSystem name="">
<UAC{}s>
</UAC{}s>
</UACSystem>
'''.format(object_type, object_type)

search_elm = 'UAC{}s'.format(object_type)             

#parsing  xml
object_root = ET.ElementTree().getroot()
tgt_xml = ET.fromstring(base_tree)

#for every name of listed objects request their definition
for obj_nm in object_rt_lst.iter('name'):
    #if tenant code in obj_nm.text
    object = obj_nm.text
    if object.startswith(syscode):
         try:
            object_root = req_lib.get_object(object).getroot()
        except:
           #temporary pass objects with invalid names
            pass
    tgt_xml.find(search_elm).append(object_root)
    print type(tgt_xml)

#delete sysIds, retainSysIds to false
for elmt in tgt_xml.findall('sysId'):
    elmt.text=''
#changing attributes: retainSysId to False 
for elmt in tgt_xml.findall("[@retainSysIds]"):
    elmt.attrib['retainSysIds']='false'
#removing version attribute
for elmt in tgt_xml.findall("[@version]"):
   elmt.attrib.pop('version', None)

#saving final workflow
tree = ET.ElementTree(tgt_xml)
tree_str = ET.tostring(finalpath)

#saving file
with open(finalpath, "wb") as tgt_f:
   tgt_f.write(tree)

Я создал базовый xml, который должен обновляться в соответствии стип объекта.Затем я получаю список заданных объектов, анализирую их имена, получаю их определение xml и добавляю базовый xml.Затем некоторое «очищение».В конце я хотел бы сохранить созданный XML в файл.Но очистка и сохранение не работает.Я думаю, что tgt_xml создает проблему, но пока не могу найти где.

Фактический код выдает мне ошибку:

Traceback (most recent call last):
  File "system_uac_export.py", line 101, in <module>
    tree_str = ET.tostring(finalpath)
  File "/usr/lib64/python2.7/xml/etree/ElementTree.py", line 1126, in 
tostring
    ElementTree(element).write(file, encoding, method=method)
  File "/usr/lib64/python2.7/xml/etree/ElementTree.py", line 817, in write
    self._root, encoding, default_namespace
  File "/usr/lib64/python2.7/xml/etree/ElementTree.py", line 876, in 
_namespaces
   iterate = elem.getiterator # cET compatibility
AttributeError: 'str' object has no attribute 'getiterator'

При других изменениях меня выдает ошибка 'NonType'.

Может кто-нибудь мне помочь, пожалуйста?

...