[英]remove empty tags and the parent if empty as well from xml using python
[英]Clean xml ==> Remove line if any empty tags
我想清理我的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)
實現上述目標的最佳方法是什么?
使用XML解析器 。
我們的想法是使用//*[not(node())]
XPath表達式查找所有空節點 , 並將其從樹中刪除 。 例如,使用lxml
:
from lxml import etree
data = """
<Items>
<Name>Hello</Name>
<Cost>9.99</Cost>
<Condition/>
</Items>
"""
root = etree.fromstring(data)
for element in root.xpath(".//*[not(node())]"):
element.getparent().remove(element)
print etree.tostring(root, pretty_print=True)
對於XML數據,可以考慮該解決方案的第n級深度。
from lxml import etree
def recursively_empty(xml_element):
if xml_element.text:
return False
return all((recursively_empty(xe) for xe in xml_element.iterchildren()))
data = """
<Items>
<Name>Hello</Name>
<Cost>9.99</Cost>
<Condition/>
</Items>
"""
xml_root = etree.iterwalk(data)
for action, xml_element in xml_root:
parent = xml_element.getparent()
if recursively_empty(xml_element):
parent.remove(xml_element)
請注意:使用遞歸方法背后的原因是為了解決多層次的XML數據深度問題。
解決方案應該適用於各種深度
data1 = """
<Items>
<Name>Hello</Name>
<Cost>9.99</Cost>
<Condition/>
</Items>
"""
data2 = """
<Items>
<Name>Hello</Name>
<Cost>9.99</Cost>
<Condition>
<cond1>Somedata</cond1>
</Condition>
</Items>
"""
data3 = """
<Items>
<Name>Hello</Name>
<Cost>9.99</Cost>
<Condition>
</cond1>
</Condition>
</Items>
"""
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.