Вам не нужно open()
файл для чтения или записи;используйте lxml's parse()
для разбора файла и write()
для записи нового.
Вы также можете использовать ось self::
xpathвместо питона if
для проверки имени тега.
Пример ...
Ввод XML (old.xml)
<parent>
<child>
<value1>Foo</value1>
<value2>Bar</value2>
<value3>Hello World</value3>
<value3/>
<value3/>
<value3/>
</child>
</parent>
Python
from lxml import etree
def remove_empty_tag(tag, original_file, new_file):
root = etree.parse(original_file)
for element in root.xpath(f".//*[self::{tag} and not(node())]"):
element.getparent().remove(element)
# Serialize "root" and create a new tree using an XMLParser to clean up
# formatting caused by removing elements.
parser = etree.XMLParser(remove_blank_text=True)
tree = etree.fromstring(etree.tostring(root), parser=parser)
# Write to new file.
etree.ElementTree(tree).write(new_file, pretty_print=True, xml_declaration=True, encoding="utf-8")
remove_empty_tag("value3", "old.xml", "new.xml")
Вывод XML (new.xml)
<?xml version='1.0' encoding='UTF-8'?>
<parent>
<child>
<value1>Foo</value1>
<value2>Bar</value2>
<value3>Hello World</value3>
</child>
</parent>
Примечание: Сериализация и создание нового дерева не являются строго необходимыми.Вместо этого вы можете сделать это:
root.write(new_file, pretty_print=True, xml_declaration=True, encoding="utf-8")
, но форматирование вывода будет немного другим (обратите внимание на дополнительный отступ конечного тега child
:
<?xml version='1.0' encoding='UTF-8'?>
<parent>
<child>
<value1>Foo</value1>
<value2>Bar</value2>
<value3>Hello World</value3>
</child>
</parent>