<p>你很接近。以下两个XPath选择与删除条件匹配的元素</p>
<pre><code>import lxml.etree
file_name = r'test.xml'
parser = lxml.etree.XMLParser(strip_cdata=False)
tree = lxml.etree.parse(file_name, parser)
root = tree.getroot()
# remove <Request> lacking a <Program>keep</Program>
for request in tree.xpath(
"Request[not(ProgramSelection/Program[contains(text(),keep)])]"):
request.getparent().remove(request)
# remove <Program>hedge</Program>
for program in tree.xpath(
"Request/ProgramSelection/Program[contains(text(), hedge)]"):
program.getparent().remove(program)
print(lxml.etree.tostring(tree, pretty_print=True).decode())
</code></pre>
<p>您可以将它们组合成可读性稍差的“或”</p>
<pre><code>import lxml.etree
file_name = r'test.xml'
parser = lxml.etree.XMLParser(strip_cdata=False)
tree = lxml.etree.parse(file_name, parser)
root = tree.getroot()
# remove <Request> lacking a <Program>keep</Program>
# remove <Program>hedge</Program>
for elem in tree.xpath("Request[
not(ProgramSelection/Program[contains(text(),keep)])]"
"|"
"Request/ProgramSelection/Program[contains(text(), hedge)]"):
elem.getparent().remove(elem)
print(lxml.etree.tostring(tree, pretty_print=True).decode())
</code></pre>