Удаление элементов - это немного больше работы в ElementTree, чем в lxml, потому что lxml имеет функцию getparent()
.
В ElementTree сначала необходимо сопоставить родительский элемент удаляемого элемента.
Поддержка xpath ElementTree тоже невелика, поэтому .//*[sysId]
не будет соответствовать первому элементу sysId
, так как это прямой дочерний элемент корневого элемента. Вам придется удалить их отдельно.
Пример ...
import xml.etree.ElementTree as ET
xml = """<root>
<sysId></sysId>
<b></b>
<c>
<sysId></sysId>
</c>
<d>
<e>
<sysId></sysId>
</e>
</d>
</root>"""
root = ET.fromstring(xml)
# find/remove direct "sysId" children of root
for child in root.findall("sysId"):
root.remove(child)
# find elements that contain a "sysId" child element
for parent in root.findall(".//*[sysId]"):
# find/remove direct "sysId" children of parent
for child in parent.findall("sysId"):
parent.remove(child)
print ET.tostring(root)
Печатная продукция ...
<root>
<b />
<c>
</c>
<d>
<e>
</e>
</d>
</root>
Вот пример lxml , чтобы показать разницу (тот же печатный вывод, что и выше) ...
from lxml import etree
xml = """<root>
<sysId></sysId>
<b></b>
<c>
<sysId></sysId>
</c>
<d>
<e>
<sysId></sysId>
</e>
</d>
</root>"""
root = etree.fromstring(xml)
for elem in root.xpath(".//sysId"):
elem.getparent().remove(elem)
print etree.tostring(root)