使用lxml的ElementTree API实现从XML文档中完全删除给定元素很容易,但是我看不到用一些文本一致地替换元素的简单方法.例如,给出以下输入:
input = '''<everything>
<m>Some text before <r/></m>
<m><r/> and some text after.</m>
<m><r/></m>
<m>Text before <r/> and after</m>
<m><b/> Text after a sibling <r/> Text before a sibling<b/></m>
</everything>
'''
...你可以轻松删除每个<r>元素:
from lxml import etree
f = etree.fromstring(data)
for r in f.xpath('//r'):
    r.getparent().remove(r)
print etree.tostring(f, pretty_print=True)
但是,你将如何用文本替换每个元素,以获得输出:
<everything>
<m>Some text before DELETED</m>
<m>DELETED and some text after.</m>
<m>DELETED</m>
<m>Text before DELETED and after</m>
<m><b/>Text after a sibling DELETED Text before a sibling<b/></m>
</everything>
在我看来,这是因为通过与文字ElementTree的API交易.text和 …
我想清理我的xml,这样不仅它是有效的XML,而且它以一种非常人类可读的方式进行格式化.例如:
<Items>
    <Name>Hello</Name>
    <Cost>9.99</Cost>
    <Condition/>
</Items>
我想删除任何带有空标记的行,留下:
<Items>
    <Name>Hello</Name>
    <Cost>9.99</Cost>
</Items>
我尝试使用正则表达式进行此操作,但在将其保留为可读格式方面并没有太多运气:
txt = etree.tostring(self.xml_node, pretty_print=True)
txt = re.sub(r'<[a-zA-Z]+/>\n', '', txt)
实现上述目标的最佳方法是什么?