问题描述
我正在使用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 (将#修改为@)