Поскольку вы используете модуль lxml
, рассмотрим XSLT , язык специального назначения, предназначенный для преобразования файлов XML. При таком подходе петли for
или if
logi c не требуются. Кроме того, XSLT является переносимым, поэтому его можно запускать гораздо дальше Python.
Следующий скрипт запускает Identity Transform для копирования документа как есть, а затем запускает два пустых шаблона в нужной логике c чтобы удалить их содержимое.
XSLT (сохранить как файл .xsl)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="text()">
<xsl:value-of select='normalize-space()'/>
</xsl:template>
<xsl:template match="Program[contains(text(),'hedge')]"/>
<xsl:template match="Request[not(contains(., 'keep'))]"/>
</xsl:stylesheet>
Python
import lxml.etree as et
doc = et.parse('Input.xml')
xsl = et.parse('XSLT_Script.xsl')
transform = et.XSLT(xsl)
result = transform(doc)
# OUTPUT TO SCREEN
print(result)
# OUTPUT TO FILE
with open('Output.xml', 'wb') as f:
f.write(result)
Выход
<?xml version="1.0"?>
<Requests>
<Request>
<ProgramSelection>
<Program>keep</Program>
</ProgramSelection>
</Request>
</Requests>
Online Demo