How to rewrite thid XML file?

Question:

I trying to rewrite this xml file containing this XML code:

<?xml version="1.0" encoding="UTF-8"?>
<BrowserAutomationStudioProject>
     <ModelList>
          <Model>
               <Name>token</Name>
               <Description ru="token" en="token"/>
               <Value>5660191076:AAEY8RI3hXcI3dEvjWAj7p2e7DdxOMNjPfk8</Value>
          </Model>
          <Defaults/>
          <Model>
               <Name>chat_id</Name>
               <Value>5578940124</Value>
          </Model>
          <Defaults/>
     </ModelList>
</BrowserAutomationStudioProject>

My python code:

import xml.etree.ElementTree as ET

tree = ET.parse('Actual.xml')
root = tree.getroot()

for model in root.findall('Model'):
    name = model.find('Name').text
    if name == 'token':
        model.find('Value').text = '123456789:ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    if name == 'chat_id':
        model.find('Value').text = '1234567890'

tree.write('xml_file.xml')

It works but I get the same file:

<?xml version="1.0" encoding="UTF-8"?>
<BrowserAutomationStudioProject>
     <ModelList>
          <Model>
               <Name>token</Name>
               <Description ru="token" en="token"/>
               <Value>5660191076:AAEY8RI3hXcI3dEvjWAj7p2e7DdxOMNjPfk8</Value>
          </Model>
          <Defaults/>
          <Model>
               <Name>chat_id</Name>
               <Value>5578940124</Value>
          </Model>
          <Defaults/>
     </ModelList>
</BrowserAutomationStudioProject>

What’s wrong with my code?
Even ChatGPT can’t help me haha
I even tried to print it but it doesn’t work
What I should do?
Please help me.

Asked By: kamazz

||

Answers:

As described in the documentation, Element.findall() finds only elements with a tag which are direct children of the current element.. You need to force ET to selects all subelements, on all levels beneath the current element by using //.

Since <Model> is not a direct child of root (it’s a grandchild, or something to that effect :)), root.findall('Model') finds nothing. So to get ET to find it, you need to modify that to

root.findall('.//Model')

and it should work.

Answered By: Jack Fleeting

You could also use for model in root.findall('ModelList/Model').

Answered By: Martin Honnen

If you know the order of the xml tag you can do something like pop() the values from a list by iterate through the tree:

import xml.etree.ElementTree as ET

tree = ET.parse('Actual.xml')
root = tree.getroot()

input_value = ['1234567890','123456789:ABCDEFGHIJKLMNOPQRSTUVWXYZ']

for elem in root.iter():
    if elem.tag == "Value":
        elem.text = input_value.pop()
        print(elem.tag, elem.text)

tree.write('xml_file.xml')

Output:

<?xml version="1.0"?>
<BrowserAutomationStudioProject>
  <ModelList>
    <Model>
      <Name>token</Name>
      <Description ru="token" en="token" />
      <Value>123456789:ABCDEFGHIJKLMNOPQRSTUVWXYZ</Value>
    </Model>
    <Defaults />
    <Model>
      <Name>chat_id</Name>
      <Value>1234567890</Value>
    </Model>
    <Defaults />
  </ModelList>
</BrowserAutomationStudioProject>
Answered By: Hermann12
Categories: questions Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.