Вы можете выполнить фильтрацию следующим образом:
from lxml import etree as et
# Read the XML file
parser = et.XMLParser(remove_blank_text=True)
ns = {'gmd': 'http://www.isotc211.org/2005/gmd'}
tree = et.parse('Input.xml', parser)
root = tree.getroot()
# Processing loop
for it in root.findall('.//gmd:descriptiveKeywords', ns):
if it.find('.//*[@uuidref]') is not None:
it.getparent().remove(it)
# Print the result
print(et.tostring(root, method='xml', encoding='unicode', pretty_print=True))
Обратите внимание, что ваш XML - это пространство имен , поэтому для ссылки на любой элемент с пространством имен (даже по умолчанию ) вы должны:
- определить словарь пространства имен (я назвал его ns ),
- указать имена элементов с правильным префиксом пространства имен,
- передайте указанный выше словарь в качестве второго параметра (например) findall .
Результат:
<MD_Metadata xmlns="http://www.isotc211.org/2005/gmd"
xmlns:gco="http://www.isotc211.org/2005/gco">
<identificationInfo>
<MD_DataIdentification>
<descriptiveKeywords>
<MD_Keywords>
<keyword>
<gco:CharacterString>Keyword1</gco:CharacterString>
</keyword>
</MD_Keywords>
</descriptiveKeywords>
</MD_DataIdentification>
</identificationInfo>
</MD_Metadata>
Внимание: я написал приведенный выше код используя Python 3,8 . Не уверен, будет ли работать в версии 2.7 . Если нет, возможно, вам стоит подумать об обновлении программного обеспечения.