簡體   English   中英

清理xml ==>刪除行(如果有空標記)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM