导出前按预定义顺序排序 XML

sort with predifined order before exporting XML

我希望你们做得很好。

我正在尝试使用预定义的顺序对 XML 进行排序,作为主要标准和基于“id”的第二个标准我正在处理的 XML 文件在导出它之前。 我正在使用“xml.etree.ElementTree”,并且我已经添加了所有需要的元素和子元素,最后我无法解决的部分是排序。

导出的XMLXML如下:

<List>
    <Level1>
        <LevelA id="zzz"/>
            <DO name="Info01"/>
        </LevelA >
        <LevelB id="ccc"/>
            <DO name="Info01"/>
        </LevelB>  
        <LevelA id="aaa"/>
            <DO name="Info01"/>
        </LevelA >
        <LevelC id="bbb"/>
            <DO name="Info01"/>
        </LevelC>
        <LevelA id="ddd"/>
            <DO name="Info01"/>
        </LevelA>   
        <LevelB id="aaa"/>
            <DO name="Info01"/>
        </LevelB>  
        <LevelC id="aaa"/>
            <DO name="Info01"/>
        </LevelC>         
    </Level1>
</List>

定义的顺序是:

predefined_order = [ 'LevelA', 'LevelB', 'LevelC']

预计:

<List>
    <Level1>
        <LevelA id="aaa"/>
            <DO name="Info01"/>
        </LevelA >
        <LevelA id="ddd"/>
            <DO name="Info01"/>
        </LevelA>   
        <LevelA id="zzz"/>
            <DO name="Info01"/>
        </LevelA >
        <LevelB id="aaa"/>
            <DO name="Info01"/>
        </LevelB>  
        <LevelB id="ccc"/>
            <DO name="Info01"/>
        </LevelB> 
        <LevelC id="aaa"/>
            <DO name="Info01"/>
        </LevelC> 
        <LevelC id="bbb"/>
            <DO name="Info01"/>
        </LevelC>         
    </Level1>
</List>

请帮我提供一些线索。

谢谢

D

尝试:

xml_doc = """
<List>
    <Level1>
        <LevelA id="zzz">
            <DO name="Info01"/>
        </LevelA>
        <LevelB id="ccc">
            <DO name="Info01"/>
        </LevelB>
        <LevelA id="aaa">
            <DO name="Info01"/>
        </LevelA>
        <LevelC id="bbb">
            <DO name="Info01"/>
        </LevelC>
        <LevelA id="ddd">
            <DO name="Info01"/>
        </LevelA>
        <LevelB id="aaa">
            <DO name="Info01"/>
        </LevelB>
        <LevelC id="aaa">
            <DO name="Info01"/>
        </LevelC>
    </Level1>
</List>
"""

from xml.etree.ElementTree import fromstring, tostring

myxml = fromstring(xml_doc)
predefined_order = ["LevelA", "LevelB", "LevelC"]

level1 = myxml.find(".//Level1")
level1[:] = sorted(
    level1,
    key=lambda child: (predefined_order.index(child.tag), child.get("id")),
)

print(tostring(myxml).decode("utf-8"))

打印:

<List>
    <Level1>
        <LevelA id="aaa">
            <DO name="Info01" />
        </LevelA>
        <LevelA id="ddd">
            <DO name="Info01" />
        </LevelA>
        <LevelA id="zzz">
            <DO name="Info01" />
        </LevelA>
        <LevelB id="aaa">
            <DO name="Info01" />
        </LevelB>
        <LevelB id="ccc">
            <DO name="Info01" />
        </LevelB>
        <LevelC id="aaa">
            <DO name="Info01" />
        </LevelC>
    <LevelC id="bbb">
            <DO name="Info01" />
        </LevelC>
        </Level1>
</List>