Сравните значения атрибутов и тексты между двумя xml-файлами и запишите в файл на Python

#python #xml #elementtree

Вопрос:

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

strings_src.xml:

 <resources>
   <string name="app_name">SkidSteerLoader</string>
   <string name="hello_world">Hello world!</string>
   <string name="action_settings">Settings</string>
   <string name="title_activity_speed">SpeedActivity</string>
</resources>
 

strings_da.xml:

 <resources>
   <string name="title_activity_speed">SpeedActivity</string>
   <string name="app_name">SkidSteerLoader</string>
   <string name="hello_world">Hej Verden!</string>
</resources>
 

Структура довольно похожа, но во втором файле может быть меньше элементов.
Мне нужно сравнить имена строк и значения для каждой строки: если имя строки одинаковое, а значение строки одинаковое, мне нужно добавить что-то вроде traduci = «да» в строковый тег второго файла.
Что-то вроде:

  <resources>
   <string name="title_activity_speed" traduci = "yes">SpeedActivity</string>
   <string name="app_name" traduci = "yes">SkidSteerLoader</string>
   <string name="hello_world">Hej Verden!</string>
 </resources>
 

Я уже пытался использовать комбинацию циклов for и условий if в python, используя дерево элементов, но я явно делаю что-то не так

 import xml.etree.ElementTree as ET
tree_src = ET.parse('strings_src.xml')
root_src = tree_src.getroot()
tree_tar = ET.parse('strings_da.xml')
root_tar = tree_tar.getroot()

for child_src in root_src:
    for child_tar in root_tar:
        if child_src.tag == child_tar.tag and child_src.text != child_tar.text:
            child_tar.set = ('traduci', 'yes')

tree_tar.write('output_da.xml')
 

Что я могу сделать?

Комментарии:

1. Если вы можете использовать lxml вместо ElementTree, это довольно просто.

Ответ №1:

Вы можете просмотреть каждый файл отдельно, создать словарь с первым файлом dict = {sourceline:elem_text}, затем при повторном просмотре второго файла сравнить каждую строку с dict в памяти и внести необходимые изменения.