我希望有人可以帮助我解决以下问题。
我有一个丑陋的大 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)