首页 > 解决方案 > 使用 Python 使用属性名称按路径搜索元素并替换 xml 中的值

问题描述

如何使用 Python 为元素提供具有属性值的完整路径并替换 xml 中的元素值

例如:我有这样的 xml 文件:

 <bw>
        <bwprocesses>
                <bwprocess name="Business_Processes/Source_Processes/Receive Batch Message.process">
                    <starter>Receive Batch Message</starter>
                </bwprocess>
                <bwprocess name="Business_Processes/Source_Processes/Type Subscriber.process">
                    <starter>Receive Trade Message</starter>
                </bwprocess>
                <bwprocess name="Business_Processes/Source_Processes/Message Router.process">
                    <starter>Message JMS Queue Receiver</starter>
                </bwprocess>
        </bwprocesses>
</bw>

并希望通过提供需要更新的完整元素路径(带有属性值)来更新 xml。

输入:bwprocesses/bwprocess [Business_Processes/Source_Processes/Receive Batch Message.process]/starter = new Massage(新值应更新以代替 .xml 中的“Receive Batch Message”)

我尝试使用 xml.etree.ElementTree 搜索示例,但找不到任何有用的信息。尝试使用下面的代码搜索元素但出现错误。请帮助解决。

import xml.etree.ElementTree as ET
tree = ET.parse('a.xml')
root = tree.getroot()
for e in root.findall('bwprocesses/bwprocess[@name='Business_Processes/Source_Processes/Receive Batch Message.process']/starter'):
    print e.text

标签: pythonxmlparsing

解决方案


见下文

import xml.etree.ElementTree as ET
xml = '''<bw>
        <bwprocesses>
                <bwprocess name="Business_Processes/Source_Processes/Receive Batch Message.process">
                    <starter>Receive Batch Message</starter>
                </bwprocess>
                <bwprocess name="Business_Processes/Source_Processes/Type Subscriber.process">
                    <starter>Receive Trade Message</starter>
                </bwprocess>
                <bwprocess name="Business_Processes/Source_Processes/Message Router.process">
                    <starter>Message JMS Queue Receiver</starter>
                </bwprocess>
        </bwprocesses>
</bw>'''
root = ET.fromstring(xml)
for e in root.findall("bwprocesses/bwprocess[@name='Business_Processes/Source_Processes/Receive Batch Message.process']/starter"):
    print('Before: {}'.format(e.text))
    e.text = 'Any text you want'

for e in root.findall("bwprocesses/bwprocess[@name='Business_Processes/Source_Processes/Receive Batch Message.process']/starter"):
    print('After: {}'.format(e.text))

推荐阅读