Python:将相等的XML元素转换为嵌套的子元素 - 父元素

时间:2016-02-06 17:21:52

标签: python xml automation xml.etree

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

我有一个丑陋的大型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我会的。

非常感谢任何形式的帮助。 谢谢。

EDIT。

这是我到目前为止所做的工作:

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)

0 个答案:

没有答案