在python etree中对XML进行排序

T1M*_*T1M 8 python xml sorting

我知道之前已经问过这个问题,但是我正在努力让它与我的例子一起工作,并且非常感谢一些帮助.我想要实现的目标看起来相当简单:我有2个文件,1个类似于下面的文件,第二个几乎相同,只是它只有LAYER然后是TEST NAME - 即.没有MASTER.

<MASTER>
<LAYER NAME="LAYER B">
    <TEST NAME="Soup1">
        <TITLE>Title 2</TITLE>
        <SCRIPTFILE>PAth 2</SCRIPTFILE>
        <ASSET_FILE PATH="Path 22" />
        <ARGS>
          <ARG ID="arg_21">some_Arg11</ARG>
          <ARG ID="arg_22">some_Arg12</ARG>
        </ARGS>
        <TIMEOUT OSTYPE="111">1200</TIMEOUT>
    </TEST>

    <TEST NAME="Bread2">
        <TITLE>Title 1</TITLE>
        <SCRIPTFILE>PAth 1</SCRIPTFILE>
        <ASSET_FILE PATH="Path 11" />        
        <ARGS>
          <ARG ID="arg_11">some_Arg12</ARG>
          <ARG ID="arg_12">some_Arg22</ARG>
        </ARGS>
        <TIMEOUT OSTYPE="2222">1000</TIMEOUT>
    </TEST>
</LAYER>
<LAYER NAME="LAYER A">
    <TEST NAME="Soup2">
        <TITLE>Title 2</TITLE>
        <SCRIPTFILE>PAth 2</SCRIPTFILE>
        <ASSET_FILE PATH="Path 22" />
        <ARGS>
          <ARG ID="arg_21">some_Arg11</ARG>
          <ARG ID="arg_22">some_Arg12</ARG>
        </ARGS>
        <TIMEOUT OSTYPE="111">1200</TIMEOUT>
    </TEST>

    <TEST NAME="Bread2">
        <TITLE>Title 1</TITLE>
        <SCRIPTFILE>PAth 1</SCRIPTFILE>
        <ASSET_FILE PATH="Path 11" />        
        <ARGS>
          <ARG ID="arg_11">some_Arg12</ARG>
          <ARG ID="arg_12">some_Arg22</ARG>
        </ARGS>
        <TIMEOUT OSTYPE="2222">1000</TIMEOUT>
    </TEST>
</LAYER>
</MASTER>
Run Code Online (Sandbox Code Playgroud)

而我所要做的就是根据NAME对这些文件进行排序,尊重各个层.

在上面的场景中,LAYER A应该在LAYER B之前,在每一层中,它们应该由NAME订购,因此在Soup之前面包.对于我的第二种情况,我没有这些子图层.

<LAYER>
    <TEST NAME="Soup1">
        <TITLE>Title 2</TITLE>
        <SCRIPTFILE>PAth 2</SCRIPTFILE>
        <ASSET_FILE PATH="Path 22" />
        <ARGS>
          <ARG ID="arg_21">some_Arg11</ARG>
          <ARG ID="arg_22">some_Arg12</ARG>
        </ARGS>
        <TIMEOUT OSTYPE="111">1200</TIMEOUT>
    </TEST>

    <TEST NAME="Bread2">
        <TITLE>Title 1</TITLE>
        <SCRIPTFILE>PAth 1</SCRIPTFILE>
        <ASSET_FILE PATH="Path 11" />        
        <ARGS>
          <ARG ID="arg_11">some_Arg12</ARG>
          <ARG ID="arg_12">some_Arg22</ARG>
        </ARGS>
        <TIMEOUT OSTYPE="2222">1000</TIMEOUT>
    </TEST>
</LAYER>
Run Code Online (Sandbox Code Playgroud)

我希望它们按TEST NAME排序.

在此先感谢您的帮助将不胜感激.

enr*_*cis 16

使用ElementTree,您可以这样做:

import xml.etree.ElementTree as ET

def sortchildrenby(parent, attr):
    parent[:] = sorted(parent, key=lambda child: child.get(attr))

tree = ET.parse('input.xml')
root = tree.getroot()

sortchildrenby(root, 'NAME')
for child in root:
    sortchildrenby(child, 'NAME')

tree.write('output.xml')
Run Code Online (Sandbox Code Playgroud)