导出前按预定义顺序排序 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>
我希望你们做得很好。
我正在尝试使用预定义的顺序对 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>