Как изменить текст элемента в файле XML на основе значений других элементов, используя ElementTree - PullRequest
0 голосов
/ 04 июля 2019

Я пытаюсь отредактировать файл XML с помощью Python ElementTree. Мне нужен мой код для замены текста всех элементов с тегом «от» на значения текста элементов с тегом «до». Значения следует заменить внутри родительских элементов.

Пример 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 Ответ

1 голос
/ 04 июля 2019

Здесь

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>
...