首页 > 解决方案 > 使用python从xml中删除空标签和父标签(如果为空)

问题描述

我是 python 新手,并试图使用 lxml 从 XML 中删除空标签。我想摆脱所有空元素,如果这样做,父元素也是空的,我也想删除它。

实际 XML

<magento_api>
  <data_item>
    <code>400</code>
    <message>Attribute weight is not applicable for product type Configurable Product</message>
  </data_item>
  <data_item>
    <code></code>
    <message>Resource data pre-validation error.</message>
  </data_item>
  <data_item>
    <code>1</code>
    <message></message>
  </data_item>
  <data_item>
    <code></code>
    <message></message>
  </data_item>
</magento_api>

修改后的 XML

<magento_api>
  <data_item>
    <code>400</code>
    <message>Attribute weight is not applicable for product type Configurable Product</message>
  </data_item>
  <data_item>
    <message>Resource data pre-validation error.</message>
  </data_item>
  <data_item>
    <code>1</code>
  </data_item>
</magento_api>

我使用了类似下面的东西,但它不起作用

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 = """
<magento_api>
<data_item>
 <code>400</code>
<message>Attribute weight is not applicable for product type Configurable Product</message>
</data_item>
<data_item>
<code>400</code>
<message></message>
</data_item>
<data_item>
<code></code>
<message>abc</message>
</data_item>
<data_item>
<code></code>
<message></message>
</data_item>
</magento_api>
"""

xml_root = etree.fromstring(data)

for action, xml_element in xml_root:
    parent = xml_element.getparent()
    if recursively_empty(xml_element):
        parent.remove(xml_element)

print (etree.tostring(xml_root))

标签: pythonxmllxml

解决方案


您可以做的一件事是normalize-space()在每个元素上使用 xpath 函数来获取字符串值。如果为空,则删除该元素。

例子...

Python(注意:我使用了您的“实际 XML”示例;而不是您在 Python 中使用的 XML。)

from lxml import etree

data = """
<magento_api>
  <data_item>
    <code>400</code>
    <message>Attribute weight is not applicable for product type Configurable Product</message>
  </data_item>
  <data_item>
    <code></code>
    <message>Resource data pre-validation error.</message>
  </data_item>
  <data_item>
    <code>1</code>
    <message></message>
  </data_item>
  <data_item>
    <code></code>
    <message></message>
  </data_item>
</magento_api>
"""

parser = etree.XMLParser(remove_blank_text=True)
xml_root = etree.fromstring(data, parser=parser)

for xml_element in xml_root.iter():
    content = xml_element.xpath('normalize-space()')
    if not content:
        xml_element.getparent().remove(xml_element)

print(etree.tostring(xml_root, pretty_print=True).decode())

输出

<magento_api>
  <data_item>
    <code>400</code>
    <message>Attribute weight is not applicable for product type Configurable Product</message>
  </data_item>
  <data_item>
    <message>Resource data pre-validation error.</message>
  </data_item>
  <data_item>
    <code>1</code>
  </data_item>
</magento_api>

推荐阅读