Замена атрибутов в соответствии с именем тега в xml с использованием elementtree и python

У меня есть xml файл

<?xml version = "1.0"?>
<data>
    <country name = "Panama">
        <rank>1</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name = "Austria" direction = "E"/>
        <neighbor name = "Switzerland" direction = "W"/>
    </country>
    <country name = "Malaysia">
        <rank>4</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name = "Malaysia" direction = "N"/>
    </country>
    <country name = "Liechtenstein">
        <rank>68</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighbor name = "Costa Rica" direction = "W"/>
        <neighbor name = "Colombia" direction = "E"/>
    </country>
</data>

Мне нужно найти все теги стран, проверить текст с текущей позицией моего списка стран, если они не совпадают, мы заменяем название страны правильным именем из моего списка. Он также должен создать файл log.txt (эта часть в порядке). Например, некоторые имена не в порядке (соседи Панамы - это не Австрия и Швейцария), поэтому их нужно заменить, и это длинный xml, поэтому я хочу написать сценарий, который сделает это автоматически.

import xml.etree.ElementTree as ET
import os
from xml.etree.ElementTree import SubElement

base_path = os.path.dirname(os.path.realpath(__file__))
xml_file = os.path.join(base_path, 'data.xml')
tree = ET.parse(xml_file)
root = tree.getroot()

Tags = ['country', 'rank', 'year']
right_data = ['Liechtenstein', 'Singapore', 'Panama']
# I need a log of the changes
f = open('Log.txt','w')

i =0
for tag in Tags[i:]:
    print tag
    for child in root.iter():
        print child
        if tag == child.tag:
            print 'We found matching tag %s' % tag
            if child.text != right_data[i]:
                print 'We are changing %s ' % child.text, 'to --> %s'% right_data[i]
                f.write('Changing  %s -->' % child.text)
                f.write('to name %s\n' % right_data[i])
                #This is where the problems start
                #This is supposed to find text attribute and replace it the    right_data[i] at position i
                #I get this error when I run my program
                #SyntaxError: can't assign to function call

                tree.find(child.text) = right_data[i]

        else: 
            "There is no such tag"
f.close()


new_data = ET.tostring(root)
new_xml = open('dataUpdated.xml', 'w')
new_xml.write(new_data)

Я знаю, что таким образом могу заменить текст в XML-файле.

tree.find('Panama').text = 'Liechtenstein'
tree.write(datafile)

Однако, когда я передаю список (righ_data [] и child.text) в качестве аргументов, ему это не нравится, и он выдает ошибку, описанную выше.

некоторые имена неправильные ... что значит не так? Неправильно написано, заказано, присутствует? Я вижу, что ваш список - ['Liechtenstein', 'Singapore', 'Panama'], каков ваш желаемый результат с учетом ввода, который вы показываете.
Parfait 26.10.2018 23:03

Да, в xml они указаны в неправильном порядке. В списке, который я создал, они расположены в правильном порядке. Таким образом, программа проверяет имя, если имя соответствует списку в позиции i, тогда она ничего не меняет, а если оно не совпадает, меняет его.

Luis Martinez 26.10.2018 23:06

Мне нравится, как ваш пример прямо из Документы Python.

Sunny Patel 26.10.2018 23:09

Вы пытаетесь изменить порядок всего элемента или просто исправить имена?

Sunny Patel 26.10.2018 23:09

Я просто хочу поправить имена. Я сделаю это и с рангом, но если я смогу заставить это работать, все остальное будет примерно таким же.

Luis Martinez 26.10.2018 23:11

@Parfait Также желаемый выход должен быть файлом xmlUpdated.xml с названиями стран в правильном порядке, как в моем списке ['Лихтенштейн', 'Сингапур', 'Панама']

Luis Martinez 26.10.2018 23:20
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
6
573
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я перестал пользоваться методом find (). См. Ниже, как я решил проблему. Ключ и вал - мой словарь.

customDict = {'Мыло': 'Наберите', 'Шампунь': 'H&S'}

for child in root.iter():
     for key, val customDict.items():
         if child.tag == key:
              child.tex = val

Это найдет тег, проверит, что это правильный тег, и соответствующим образом изменит его.

Другие вопросы по теме