使用 python etree 中的值对 XML 进行排序

Sorting XML using values in python etree

下面是 xml 我正在尝试使用 etree 对 fullName 中的值进行排序 考虑按字母顺序排序

<CustomLabels xmlns="http://soap.sforce.com/2006/04/metadata">
    <labels>
        <fullName>AnAutoQuote</fullName>
        <value>This is an automatically generated quote.</value>
        <language>en_US</language>
        <protected>false</protected>
        <shortDescription>Automatic Quote</shortDescription>
    </labels>
    <labels>
        <fullName>AManualQuote</fullName>
        <value>This is a manual quote.</value>
        <language>en_US</language>
        <protected>false</protected>
        <shortDescription>Manual Quote</shortDescription>
    </labels>
</CustomLabels>

Code that i tried but it returns the same xml as it got in the input. here xml contains the file that was read for input and parser is the xml parser with encoding set to utf-8


root = objectify.string(xml, parse)

for r in root.iter("labels"):
    r[:] = sorted(r, key = lambda ch: -(ch.tag=="fullname"))

print(etree.toStrin(root).decode("utf-8))

root = objectify.fromstring(xml)
root.labels = sorted(root.labels, key=lambda tag: tag.fullName)

完整代码示例:

from lxml import objectify, etree

xml = '''<CustomLabels xmlns="http://soap.sforce.com/2006/04/metadata">
    <labels>
        <fullName>ZZZAManualQuote</fullName>
        <value>This is a manual quote.</value>
        <language>en_US</language>
        <protected>false</protected>
        <shortDescription>Manual Quote</shortDescription>
    </labels>
    <labels>
        <fullName>AnAutoQuote</fullName>
        <value>This is an automatically generated quote.</value>
        <language>en_US</language>
        <protected>false</protected>
        <shortDescription>Automatic Quote</shortDescription>
    </labels>
    <labels>
        <fullName>AManualQuote</fullName>
        <value>This is a manual quote.</value>
        <language>en_US</language>
        <protected>false</protected>
        <shortDescription>Manual Quote</shortDescription>
    </labels>
</CustomLabels>'''

root = objectify.fromstring(xml)
root.labels = sorted(root.labels, key=lambda tag: tag.fullName)

print(etree.tostring(root, pretty_print=True).decode('utf-8'))

输出

<CustomLabels xmlns="http://soap.sforce.com/2006/04/metadata">
  <labels>
    <fullName>AManualQuote</fullName>
    <value>This is a manual quote.</value>
    <language>en_US</language>
    <protected>false</protected>
    <shortDescription>Manual Quote</shortDescription>
  </labels>
  <labels>
    <fullName>AnAutoQuote</fullName>
    <value>This is an automatically generated quote.</value>
    <language>en_US</language>
    <protected>false</protected>
    <shortDescription>Automatic Quote</shortDescription>
  </labels>
  <labels>
    <fullName>ZZZAManualQuote</fullName>
    <value>This is a manual quote.</value>
    <language>en_US</language>
    <protected>false</protected>
    <shortDescription>Manual Quote</shortDescription>
  </labels>
</CustomLabels>