Python XML按属性/子级排序

问题描述

我正在使用Python(2.7 / 3.8)并使用一些比较在一起的复杂XML。 XML的顺序可以不同,我正在构建一个函数作为排序规则(先查看节点属性,再查看节点子节点)。

我看了几个不同的相关问题,但都不适用于我的情况:

我可以使用key=lambda child: child.tag进行排序,但是我通常希望使用属性而不是标签名称。

在最基本的情况下,我希望能够按属性名称进行排序,检查['id','label','value']中的任何一个是否作为属性存在,并将其用作键。无论如何,我似乎无法弄清楚为什么child.tag可以进行排序,但是child.get('id')却不能。

import xml.etree.ElementTree as etree
    
input = '''
    <root>
        <node id="7"></node>
        <node id="10"></node>
        <node id="5"></node>
    </root>
'''

root = etree.fromstring(input)

root[:] = sorted(root,key=lambda child: child.get('id'))

xmlstr = etree.tostring(root,encoding="utf-8",method="xml")
print(xmlstr.decode("utf-8"))

哪个返回:

<root>
    <node id="7" />
    <node id="5" />
    <node id="10" />
</root>

预期:

<root>
    <node id="5" />
    <node id="7" />
    <node id="10" />
</root>

编辑

如前文所述,用int()包装child.get('id')确实可以解决该问题,但是该代码还必须对同时具有字母和数字的输入起作用,例如id =“ node1”, node15”,等等。

例如:

<root>
    <node id="node10" />
    <node id="node7" />
    <node id="node5" />
</root>

预期:

<root>
    <node id="node5" />
    <node id="node7" />
    <node id="node10" />
</root>

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)