#python #elementtree
#python #elementtree
Вопрос:
Я пытаюсь записать XML-файл на диск, используя эту функцию:
def modify_xml(input_file_xml, output_file_xml, input_file_names, output_path, output_format, params_sub_nodes = {}):
tree = ET.parse(input_file_xml)
root = tree.getroot()
if len(input_file_names) == 1:
file_node_input = root.find('node[@id="Read"]/parameters/file')
elif len(input_file_names) == 2:
file_node_input = root.find('node[@id="ProductSet-Reader"]/parameters/fileList')
else:
raise Exception('number of files equal to: %s not supported !' %str(len(input_file_names)))
file_node_input.text = ','.join(input_file_names)
file_node_output_name = root.find('node[@id="Write"]/parameters/file')
file_node_output_name.text = output_path
file_node_output_format = root.find('node[@id="Write"]/parameters/formatName')
file_node_output_format.text = output_format
for sub_node_name, sub_node_content in params_sub_nodes.items():
sub_node = root.find(sub_node_name)
sub_node.text = sub_node_content
print(output_file_xml)
print(type(output_file_xml))
tree.write(output_file_xml)
Но я получаю следующую ошибку типа:
in modify_xml
tree.write(output_file_xml)
File "/usr/lib/python3.6/xml/etree/ElementTree.py", line 776, in write
short_empty_elements=short_empty_elements)
File "/usr/lib/python3.6/xml/etree/ElementTree.py", line 941, in _serialize_xml
short_empty_elements=short_empty_elements)
File "/usr/lib/python3.6/xml/etree/ElementTree.py", line 941, in _serialize_xml
short_empty_elements=short_empty_elements)
File "/usr/lib/python3.6/xml/etree/ElementTree.py", line 941, in _serialize_xml
short_empty_elements=short_empty_elements)
File "/usr/lib/python3.6/xml/etree/ElementTree.py", line 938, in _serialize_xml
write(_escape_cdata(text))
TypeError: write() argument must be str, not tuple
даже если при печати output_file_xml и его типа (3 последние строки в моей функции) я получаю, что это строка:
/tmp/filter_edited.xml
<class 'str'>
XML также создается и сохраняется в указанном output_path, даже если программа завершает работу из-за этой ошибки
Как вы думаете, чего мне здесь не хватает?
Комментарии:
1. Вы уверены, что функция не вызывается дважды из вашего кода? Возможно, он был успешным при первом вызове и завершился неудачей при втором?
2. @Grismar , действительно, это именно то, что произошло.
3. Если это отвечает на вопрос, пожалуйста, не стесняйтесь либо написать свой собственный ответ с некоторым объяснением и принять его, либо закрыть / удалить вопрос, поскольку на самом деле ответа не требуется. Надеюсь, это помогло.
Ответ №1:
После тщательной отладки моего кода я нашел причину проблемы.
При установке точки останова в строке 938 из /usr/lib/python3.6/xml/etree/ElementTree.py , и визуализируя типы элементов, вставленных в дерево (текстовая переменная в функции _serialize_xml) один за другим, оказывается, что один из них был кортежем.
Это связано с запятой, которую я по ошибке добавил в конец переменной output_path при вызове функции modify_xml, которая преобразовала строку в кортеж
file_node_output_name.text = output_path
Жаль, что сообщение об ошибке было не очень выразительным ! Я имею в виду, при чтении этой ошибки:
TypeError: write() argument must be str, not tuple
Первое, что приходит на ум, это то, что ошибка типа присутствует в пути вывода XML (аргумент функции write), а не в тексте, вставленном в сам XML…