<p>如果要按文本对子节点进行排序,只需找到合法节点并使用<em>对子节点进行排序子级.text</em>作为键:</p>
<pre><code>x = """<root>
<attribute Name="attr2">
<v>
<cstat>
<s>nObjDef2</s>
<s>nObjDef1</s>
</cstat>
</v>
<objects>
<legal>
<o>otype2</o>
<o>otype1</o>
</legal>
</objects>
</attribute>
<attribute Name="attr1">
<v>
<cstat>
<s>nObjDef2</s>
<s>nObjDef1</s>
</cstat>
</v>
<objects>
<legal>
<o>otype2</o>
<o>otype1</o>
</legal>
</objects>
</attribute>
</root>
"""
</code></pre>
<p>对每个节点进行排序:</p>
^{pr2}$
<p>这将重新排列子对象:</p>
<pre><code>print(etree.tostring(xml, pretty_print=1).decode("utf-8"))
</code></pre>
<p>给你:</p>
<pre><code><root>
<attribute Name="attr2">
<v>
<cstat>
<s>nObjDef2</s>
<s>nObjDef1</s>
</cstat>
</v>
<objects>
<legal>
<o>otype1</o>
<o>otype2</o>
</legal>
</objects>
</attribute>
<attribute Name="attr1">
<v>
<cstat>
<s>nObjDef2</s>
<s>nObjDef1</s>
</cstat>
</v>
<objects>
<legal>
<o>otype1</o>
<o>otype2</o>
</legal>
</objects>
</attribute>
</root>
</code></pre>
<p>或者更有效的方法是使用<a href="https://docs.python.org/3/library/operator.html#operator.attrgetter" rel="nofollow">operator.attrgetter</a>代替lambda:</p>
<pre><code>from lxml import etree
from operator import attrgetter
xml = etree.fromstring(x)
for node in xml.xpath("//legal"):
node[:] = sorted(node, key=attrgetter("text"))
</code></pre>