Код
При запуске следующего кода я не могу сохранить вывод в виде XML-файла, так как получаю следующую ошибку AttributeError: объект «ElementTree» не имеет атрибута «тег» (в трассировке). На SO есть вопрос с аналогичным названием, но я не думаю, что он имеет отношение к моему, поскольку он был связан с разбором из корневого узла, а не с сохранением.
Код
import xml.etree.ElementTree as ET
print('\n'*5)
xmlfile = 'widget.XML'
tree = ET.parse(xmlfile)
root = tree.getroot()
#ET.dump(tree)# prints the xml file to console,shows xml indentation
print('\n'*2)
for elm in root.findall("./Common/ForceBinary"):
print(elm.attrib)
elm.attrib = {'type': 'integer', 'value': '0'}
with open("new_file.xml", "w") as f:
f.write(ET.tostring(tree))
Выслеживать
{'type': 'integer', 'value': '1'}
Traceback (most recent call last):
File "/Users/user/Desktop/MY_PY/x_08.py", line 16, in <module>
f.write(ET.tostring(tree))
File "/Users/user/opt/anaconda3/lib/python3.7/xml/etree/ElementTree.py", line 1136, in tostring
short_empty_elements=short_empty_elements)
File "/Users/user/opt/anaconda3/lib/python3.7/xml/etree/ElementTree.py", line 777, in write
short_empty_elements=short_empty_elements)
File "/Users/user/opt/anaconda3/lib/python3.7/xml/etree/ElementTree.py", line 901, in _serialize_xml
tag = elem.tag
AttributeError: 'ElementTree' object has no attribute 'tag'
Попробовав довольно много методов для записи вывода в файл xml, эта строка сработала (я не знаю, почему, если у кого-то есть объяснение, я был бы рад принять его как ответ).
tree.write("sdn_edit2.xml")
ElementTree.tostring()
работает с Element
, что не совпадает с ElementTree
. Вы уже извлекли корневой узел через tree.getroot()
— вместо этого вам просто нужно ET.tostring(root)
.
Причина, по которой API является таким, заключается в том, что Element
предназначен в качестве структуры данных для анализируемого в памяти XML-объекта, а ElementTree
в основном просто помощник сериализации-десериализации (возможно, именование Tree
было не лучшей идеей) для соединения этих Element
с внешним миром.
Связанный вопрос о разнице между ними: В чем разница между ElementTree и Element? (питон xml)
Как и в случае с любой другой строкой, и как вы пытались в своем вопросе, откройте файл и f.write()
к нему. Вы просили объяснить, почему исходное решение не сработало, и вот оно — однако, если запись XML в файл — это все, что вам нужно, ярлык tree.write()
— это то, что вам нужно.
Спасибо, Майк, очень признателен.
Как тогда записать xml в файл?