python - 如何根据条件删除 XML 中的块
问题描述
我的 XML 文件包含 10k 个用户,我需要删除电子邮件不包含 @acme.com 的所有用户
<?xml version="1.0" encoding="UTF-8"?>
<users type="array">
<user>
<id type="integer">14000760626</id>
<name> Credentialing Department</name>
<email>user1@acme.com</email>
<created-at type="dateTime">2020-03-26T10:23:34-04:00</created-at>
<updated-at type="dateTime">2020-03-26T10:23:34-04:00</updated-at>
<active type="boolean">false</active>
<job-title></job-title>
<phone>1234567890</phone>
<mobile>1234567890</mobile>
<description></description>
<time-zone>Eastern Time (US & Canada)</time-zone>
<deleted type="boolean">false</deleted>
<language>en</language>
<address></address>
<external-id nil="true"/>
<helpdesk-agent type="boolean">false</helpdesk-agent>
<location-name nil="true"/>
<time-format>12h</time-format>
<company-names type="array"/>
<custom_field>
</custom_field>
</user>
</users>
我试图按照如何在 python 中从 XML 文件中过滤值,但在更改以下行时遇到了困难:
>>> xmldata.xpath('/localization/b[@n="Levels"]/l[@k=$level]/v/text()',level='Level1')
['Beginner Level']
我也尝试了其他方法,但总是会丢失一些数据,示例结果:
<?xml version="1.0" encoding="UTF-8"?>
<users type="array">
<user>
<id>14000760626</id>
<name> Credentialing Department</name>
<email>test@aoncology.com</email>
<created-at>2020-03-26T10:23:34-04:00</created-at>
<updated-at>2020-03-26T10:23:34-04:00</updated-at>
<active>false</active>
<job-title>None</job-title>
<phone>1234567890</phone>
<mobile>1234567890</mobile>
<description>None</description>
<time-zone>Eastern Time (US & Canada)</time-zone>
<deleted>false</deleted>
<language>en</language>
<address>None</address>
<external-id>None</external-id>
<helpdesk-agent>false</helpdesk-agent>
<location-name>None</location-name>
<time-format>12h</time-format>
<company-names>None</company-names>
<custom_field>
</custom_field>
</user>
</users>
解决方案
如果我理解正确,您正在寻找这样的东西:
假设一个简化的 XML:
users = """<?xml version="1.0" encoding="UTF-8"?>
<users type="array">
<user>
<id type="integer">14000760626</id>
<name> Credentialing Department</name>
<email>user1@acme.com</email>
</user>
<user>
<id>14000760626</id>
<name> Credentialing Department</name>
<email>test@aoncology.com</email>
</user>
</users>"""
然后:
doc = etree.XML(users.encode())
for user in doc.xpath('//users/user'):
if not "acme" in user.xpath('./email')[0].text:
user.getparent().remove(user)
print(etree.tostring(doc).decode())
输出:
<users type="array">
<user>
<id type="integer">14000760626</id>
<name> Credentialing Department</name>
<email>user1@acme.com</email>
</user>
</users>
从 lxml 导入 etree
推荐阅读
- azure - CDN - 根据接受标头 (Verizon/EdgeCast Premium) 提供不同的内容类型?
- pyqt - pyside2 QGraphicsPathItem WindingFill
- r - 尝试制作 singleR seurat 对象时出错
- python-3.x - 使用 json 通过套接字发送大数据
- php - 通过 JSON 提要加载内容时如何保持 CSS 块高度相等
- php - PHP 在 PHPMailer 中报告“无法重新声明类”
- php - 致命错误:允许的内存大小为 268435456 字节已用尽(尝试分配 8192 字节)
- asp.net-mvc - Sitefinity 更改已发布但无法在浏览器中运行
- hibernate - 对于 DDL,ElementCollection 中的 Embeddable 中的约束被忽略
- c++ - 一个类可以包含一个后来专门用于派生类的基类作为成员吗?