Заменить значения одинаковых тегов

Есть например xml файл:

<?xml version="1.0" encoding="UTF-8"?>
<shiporder orderid="889923"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="shiporder.xsd">
   <orderperson>John Smith</orderperson>
   <shipto>
      <name>Ola Nordmann</name>
      <address>Langgt 23</address>
      <city>4000 Stavanger</city>
      <country>Norway</country>
   </shipto>
   <item>
      <title>Empire Burlesque</title>
      <note>Special Edition</note>
      <quantity>1</quantity>
      <price>10.90</price>
   </item>
   <item>
      <title>Hide your heart</title>
      <quantity>1</quantity>
      <price>9.90</price>
   </item>
</shiporder>

Требуется заменить каждый тег <title> на любые рандомные слова из русских букв

Пробую сделать так:

with open('test1.xml','r') as f:
    contents=f.read() #open xml file
    #print(contents)
    
alphabet_upper = [chr(ord("А") + i) for i in range(32)]    
length_of_string = 7          
          
opentag='<title>' 
closetag='</title>'

oldtext=contents[contents.find(opentag)+7:contents.find(closetag)] 
newtext=''.join(random.choice(alphabet_upper) for i in range(length_of_string)) 
contents=contents.replace(oldtext,newtext) 

with open('testxml.xml','w') as f:
    f.write(contents) #write contents to file
    print(contents)

Но меняется только первый тэг, а второй остается неизменным. Как сделать, что бы все тэги изменились и у каждого было рандомное значение ?

Подскажите, пожалуйста.

Этот xml файл как пример, на котором тестирую, реальный файл содержит примерно около 50 тегов, которые должны изменится на рандомное значение


Ответы (1 шт):

Автор решения: Alex Titov

Сильно рекомендуется при обработке XML использовать именно XML-библиотеку, так что код мог бы выглядеть вот так. Ну а в random уже есть нужная функция для последовательности

import random
import xml.etree.ElementTree as ET

alphabet_upper = [chr(ord("А") + i) for i in range(32)]    
length_of_string = 7          

tree = ET.parse('test1.xml')
root = tree.getroot()
for title_elem in root.findall('item/title'):
    title_elem.text = ''.join(random.choices(alphabet_upper, k =length_of_string))
tree.write('test1.xml', encoding='utf-8', xml_declaration=True)
→ Ссылка