Python按and标记和属性递归地对XML元素排序

2024-09-30 01:29:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Python新手,我正在尝试用一些规则对XML进行排序。
我的例子:

<?xml version="1.0"?>
<data>
    <e2 id="3" name="name3">
        <e12 num="num12" desc="desc12"/>
        <e12 num="num12" desc="desc11"/>
        <e11 num="num1" desc="desc1"/>
    </e2>
    <e2 id="2" name="name2">
        <e11 num="num1" desc="desc1"/>
    </e2>
    <e1 id="1" name="name1">
        <e12 num="num12" desc="desc12"/>
        <e11 num="num4" desc="desc4"/>
    </e1>
</data>

我的规则是:
1) 按各个元素中的名称对每个属性进行排序
2) 排序元素
*按标记名(如果没有属性)
*如果标记名按属性顺序相同

在我的例子中,我需要先排序e1,然后再排序e2,
因为我有2个e2元素,所以我需要分别按它们的属性名进行排序,就像一个元素的id=2,第二个元素的id=3,所以应该按照id值来排序。
所需的输出XML如下所示:

^{pr2}$

有什么建议或想法吗?
谢谢您。在


Tags: nameid元素属性排序规则xmlnum
2条回答

可以使用ElementTree对XML进行排序。在我的例子中,我首先按标记名排序,然后按属性“name”的值排序,然后按标记名和属性“desc”的值对子元素进行排序

import xml.etree.ElementTree as ET
tree = ET.ElementTree(ET.fromstring(xmlstr))
root = tree.getroot()

# sort the first layer
root[:] = sorted(root, key=lambda child: (child.tag,child.get('name')))

# sort the second layer
for c in root:
    c[:] = sorted(c, key=lambda child: (child.tag,child.get('desc')))

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

这个指纹

^{pr2}$

带有xml.etree.ElementTree对象的解决方案:

import xml.etree.ElementTree as ET

tree = ET.parse('input.xml')
data = tree.getroot()
els = data.findall("*[@id]")   # all e<number> elements having `id` attribute
new_els = sorted(els, key=lambda el: (el.tag, el.attrib['id']))
for el in new_els:
    el[:] = sorted(el, key=lambda e: (e.tag, e.attrib['desc']))
data[:] = new_els

tree.write('result.xml', xml_declaration=True, encoding='utf-8')

最后的result.xml内容:

^{pr2}$

相关问题 更多 >

    热门问题