0

I have this .xml example as input:

<root>
   <user>
       <id>2</id>
       <name>xyz</name>
   </user>
   <user>
       <id>1</id>
       <name>abc</name>
   </user>
</root>

How can I sort the "users" by "id" number to get the following .xml as output:

<root>
   <user>
       <id>1</id>
       <name>abc</name>
   </user>
   <user>
       <id>2</id>
       <name>xyz</name>
   </user>
</root>

I tried using xml.etree.ElementTree but I couldn't figure it out.

3
  • Can you share the code? Commented Feb 15, 2023 at 15:45
  • Can you use lxml instead of elementtree? Commented Feb 15, 2023 at 15:57
  • Sorting based on element text with lxml Commented Feb 15, 2023 at 16:33

2 Answers 2

2

There are many ways to do this. Here's one:

import xml.etree.ElementTree as ET

xml = """<root>
   <user>
       <id>2</id>
       <name>xyz</name>
   </user>
   <user>
       <id>1</id>
       <name>abc</name>
   </user>
</root>"""

def key(e):
    return int(e.find('id').text)

_xml = ET.fromstring(xml)
root = ET.Element('root')

for user in sorted(_xml.findall('user'), key=key):
    root.append(user)

ET.indent(root, space='  ')
ET.dump(root)

Output:

<root>
  <user>
    <id>1</id>
    <name>abc</name>
  </user>
  <user>
    <id>2</id>
    <name>xyz</name>
  </user>
</root>
Sign up to request clarification or add additional context in comments.

Comments

1

Below

import xml.etree.ElementTree as ET
import copy
xml = '''<root>
   <user>
       <id>2</id>
       <name>xyz</name>
   </user>
   <user>
       <id>1</id>
       <name>abc</name>
   </user>
</root>'''

root = ET.fromstring(xml)
users = root.findall('user')
clone = users.copy()
for user in users:
    root.remove(user)
clone.sort(key=lambda x: int(x.find('id').text),reverse=False)
for user in clone:
    root.append(user)
ET.dump(root)

output

<root>
   <user>
      <id>1</id>
      <name>abc</name>
   </user>
   <user>
      <id>2</id>
      <name>xyz</name>
   </user>
</root>

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.