Den*_*niz 1 python xml sorting
我是 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>
Run Code Online (Sandbox Code Playgroud)
我的规则是:
1)按相应元素中的名称对每个属性进行
排序 2)
按标签名称对元素进行排序(如果没有属性)
* 如果标签名称按其属性顺序相同
在我的情况下,我需要先对 e1 进行排序,然后对 e2 进行排序,
因为我有 2 个 e2 元素,因此我需要分别按它们的属性名称对它们进行排序,比如一个有 id=2 第二个有 id=3,所以顺序应该按 id 完成价值。
所需的输出 XML 将如下所示:
<?xml version="1.0"?>
<data>
<e1 id="1" name="name1">
<e11 desc="desc4" num="num4"/>
<e12 desc="desc12" num="num12"/>
</e1>
<e2 id="2" name="name2">
<e11 desc="desc1" num="num1"/>
</e2>
<e2 id="3" name="name3">
<e11 num="num1" desc="desc1"/>
<e12 desc="desc11" num="num12"/>
<e12 desc="desc12" num="num12"/>
</e2>
</data>
Run Code Online (Sandbox Code Playgroud)
任何建议或想法如何做到这一点?
谢谢你。
您可以使用 ElementTree 对 XML 进行排序。在我的示例中,我首先按标签名称对其进行排序,然后按属性“名称”的值对其进行排序,然后按标签名称和属性“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"))
Run Code Online (Sandbox Code Playgroud)
这打印
<data>
<e1 id="1" name="name1">
<e11 desc="desc4" num="num4" />
<e12 desc="desc12" num="num12" />
</e1>
<e2 id="2" name="name2">
<e11 desc="desc1" num="num1" />
</e2>
<e2 id="3" name="name3">
<e11 desc="desc1" num="num1" />
<e12 desc="desc11" num="num12" />
<e12 desc="desc12" num="num12" />
</e2>
</data>
Run Code Online (Sandbox Code Playgroud)