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