如何使用ElementTree根据其他元素的值更改XML文件中元素的文本

时间:2019-07-04 14:58:00

标签: python xml elementtree

我正在尝试使用Python ElementTree编辑XML文件。我需要我的代码将标记为“ from”的所有元素的文本替换为标记为“ to”的元素的文本值。值应在父元素内替换。

示例XML文件:

<note>
    <letter>
      <to>Tove</to>
      <from>Jani</from>
    </letter>
    <letter>
      <to>Mitch</to>
      <from>Mcdeer</from>   
    </letter>
</note>

我的代码:

import os
import xml.etree.ElementTree as et

base_path = os.path.dirname(os.path.realpath(__file__))

xml_file = os.path.join(base_path, 'note.xml')

#print(xml_file)

tree = et.parse(xml_file)

root = tree.getroot()

for d in tree.findall('.//to'):
    for e in tree.findall('.//from'):
        e.text = d.text

tree.write('note1.xml')

预期结果:

<note>
    <letter>
      <to>Tove</to>
      <from>Tove</from>
    </letter>
    <letter>
      <to>Mitch</to>
      <from>Mitch</from>    
    </letter>
</note>

实际结果:

<note>
    <letter>
      <to>Tove</to>
      <from>Mitch</from>
    </letter>
    <letter>
      <to>Mitch</to>
      <from>Mitch</from>    
    </letter>
</note>

1 个答案:

答案 0 :(得分:1)

这里

import xml.etree.ElementTree as ET

xml = '''<note>
    <letter>
      <to>Tove</to>
      <from>Jani</from>
    </letter>
    <letter>
      <to>Mitch</to>
      <from>Mcdeer</from>   
    </letter>
</note>'''

root = ET.fromstring(xml)
letters = root.findall('.//letter')
for letter in letters:
    letter.find('from').text = letter.find('to').text
ET.dump(root)

输出

<note>
    <letter>
      <to>Tove</to>
      <from>Tove</from>
    </letter>
    <letter>
      <to>Mitch</to>
      <from>Mitch</from>   
    </letter>
</note>