使用Python etree更新XML元素和属性值

10 投票
1 回答
27471 浏览
提问于 2025-04-17 12:30

我正在尝试使用Python 2.7的ElementTree库来解析一个XML文件,然后用测试数据替换特定的元素属性,最后将其保存为一个独特的XML文件。

我想出的解决方案是:第一步,从CSV文件中获取新数据,把文件内容读成一个字符串;第二步,在某些分隔符处切割这个字符串;第三步,把切割后的内容添加到一个列表中;最后一步,使用ElementTree来更新、删除或替换列表中的特定值。

我查阅了ElementTree的文档,看到有clear()remove()这两个函数,但我不知道怎么正确使用它们。

下面是需要修改的XML示例 - 属性中带有XXXXX的部分需要被替换或更新:

<TrdCaptRpt RptID="10000001" TransTyp="0">
    <RptSide Side="1" Txt1="XXXXX">
        <Pty ID="XXXXX" R="1"/>
    </RptSide>
</TrdCaptRpt>

我想要的结果,比如说是:

<TrdCaptRpt RptID="10000001" TransTyp="0">
    <RptSide Side="1" Txt1="12345">
        <Pty ID="ABCDE" R="1"/>
    </RptSide>
</TrdCaptRpt>

我该如何使用etree的命令来改变基础XML,以便用列表中的某个项目进行更新呢?

1 个回答

18

对于这种工作,我总是推荐BeautifulSoup,因为它的使用方法非常简单,容易上手:

from BeautifulSoup import BeautifulStoneSoup as Soup

xml = """
<TrdCaptRpt RptID="10000001" TransTyp="0">
    <RptSide Side="1" Txt1="XXXXX">
        <Pty ID="XXXXX" R="1"/>
    </RptSide>
</TrdCaptRpt>
"""

soup = Soup(xml)
rpt_side = soup.trdcaptrpt.rptside
rpt_side['txt1'] = 'Updated'
rpt_side.pty['id'] = 'Updated'

print soup

示例输出:

<trdcaptrpt rptid="10000001" transtyp="0">
<rptside side="1" txt1="Updated">
<pty id="Updated" r="1">
</pty></rptside>
</trdcaptrpt>

补充:使用xml.etree.ElementTree,你可以用以下脚本:

from xml.etree import ElementTree as etree

xml = """
<TrdCaptRpt RptID="10000001" TransTyp="0">
    <RptSide Side="1" Txt1="XXXXX">
        <Pty ID="XXXXX" R="1"/>
    </RptSide>
</TrdCaptRpt>
"""

root = etree.fromstring(xml)
rpt_side = root.find('RptSide')
rpt_side.set('Txt1', 'Updated')
pty = rpt_side.find('Pty')
pty.set('ID', 'Updated')
print etree.tostring(root)

示例输出:

<TrdCaptRpt RptID="10000001" TransTyp="0">
    <RptSide Side="1" Txt1="Updated">
        <Pty ID="Updated" R="1" />
    </RptSide>
</TrdCaptRpt>

撰写回答