python - 使用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))
解决方案
您可以做的一件事是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>
推荐阅读
- jquery - 以编程方式更改值时引导选择多个触发器
- java - Jackson 反序列化列表
作为 POJO 的财产 - python - Django:无法使用related_name 从用户类中获取用户名
- java - bean 验证不适用于 kotlin (JSR 380)
- python - TweepError:糟糕的握手“osrandom_rand_bytes”
- go - golang 数据库事务:如果单个 exec 语句失败,则继续
- php - 登录时保存 IP,如果 IP 更改则注销,PHP MySql
- php - mediaplayer getduration 仅在我的服务器文件中返回 0
- reporting-services - SSRS 报告 - 报告服务器中的边框未正确呈现
- c# - 在 Controls.ListView 中设置初始键盘焦点