使用 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>
下面是 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>