0

我希望有人可以帮助我解决以下问题。

我有一个丑陋的大 xml 文件,如下所示:

<root>
    <level-0/>
    <level-1/>
    <level-2/>
    <level-3/>
    <level-1/>
    <level-3/>
    <level-2/>
</root>

我需要自动转换它,如下所示:

<root>
    <level-0>
        <level-1>
            <level-2>
                <level-3/>
            </level-2>
        </level-1>
        <level-1>
            <level-3/>
            <level-2/>
        </level-1>
    </level-0>
</root>

请注意,子级别并不总是将其直接父级作为实际父级。换句话说,嵌套规则是:每个元素都必须嵌套在比自身嵌套级别更高的元素中。

请考虑我已经将 xml.etree 用于非常大的一段代码,并且保持这种方式会很棒 - 尽管如此,如果有必要切换到另一个包,比如 lxml,我会的。

任何形式的帮助将不胜感激。谢谢你。

编辑。

这就是我迄今为止所拥有的哪种作品:

from xml.etree import ElementTree as ET

level_0 = []
level_1 = []
level_2 = []
level_3 = []

l0 = l1 = l2 = l3 = 0

tree = ET.parse("ugly.xml")
ugly = tree.getroot()

new = ET.Element("root")

for e in ugly:

    if e.tag == "l0":
        new.append(e)
        l0 += 1
        level_0.append(e)
        l1 = l2 = l3 = 0
    elif e.tag == "l1":
        if l1:
            if l0:
                level_0[-1].append(e)
            else:
                new.append(e)
        l1 += 1
        level_1.append(e)
        l2 = l3 = 0
    elif e.tag == "l2":
        if l2:
            if l1:
                level_1[-1].append(e)
            elif l0:
                level_0[-1].append(e)
            else:
                new.append(e)
        l2 += 1
        level_2.append(e)
        l3 = 0
    elif e.tag == "l3":
        level_3.append(e)
        if l2:
            level_2[-1].append(e)
        elif l1:
            level_1[-1].append(e)
        elif l0:
            level_0[-1].append(e)
        else:
            new.append(e)

for level in level_1:
    new.append(level)
else:
    for level in level_2:
        new.append(level)
    else:
        for level in level_3:
            new.append(level)

问题是有时某些级别是注释附录。

编辑2:

也许我明白了!

def appendeep(parent, child):

    def level(elem):
        levels = ["level-0", "level-1", "level-2", "level-3"]
        return levels.index(elem.tag)

    try:
        if level(child) > level(parent[-1]):
            parent[-1] = appendeep(parent[-1], child)
        else:
            parent.append(child)
    except IndexError:
        parent.append(child)

    return parent

tree = ET.Parse("ugly.xml")
ugly = tree.getroot()
new = ET.Element("root")

for e in ugly:
    new = appendeep(new, e)
4

0 回答 0