我有以下XML结构,如果新节点在特定位置不存在,我想添加它。
<root>
<OuterLevel>
<Node>
<Name>NodeA</Name>
</Node>
<Node>
<Name>NodeB</Name>
<Node>
<SpecialNode>
<Name>NodeZ</Name>
</SpecialNode>
</OuterLevel>
</root>
我使用元素树编写了一个python脚本。 http://docs.python.org/library/xml.etree.elementtree.html
import xml.etree.ElementTree as ET
tree = ET.parse('sampleFile.xml')
root = tree.getroot()
newNodeStr = 'NewNode'
if root[0][0].tag != newNodeStr :
print('Now we add it')
newNode = ET.Element(newNodeStr)
newNodeName = ET.Element('Name')
newNodeName.text = 'NodeC'
newNode.append(newNodeName)
root[0].insert(0, newNode)
tree.write('sampleFileNew.xml')
我希望XML结构看起来像这样:
<root>
<OuterLevel>
<NewNode>
<Name>NodeC</Name>
</NewNode>
<Node>
<Name>NodeA</Name>
</Node>
<Node>
<Name>NodeB</Name>
<Node>
<SpecialNode>
<Name>NodeZ</Name>
</SpecialNode>
</OuterLevel>
</root>
但相反,它看起来像这样:
<root>
<OuterLevel>
<NewNode><Name>NodeC</Name></NewNode><Node>
<Name>NodeA</Name>
</Node>
<Node>
<Name>NodeB</Name>
<Node>
<SpecialNode>
<Name>NodeZ</Name>
</SpecialNode>
</OuterLevel>
</root>
我使用了元素树中的insert()方法,因为我认为它会给我我需要的东西,即在特定位置插入一个节点。但是,看起来insert()实际上并不关心树结构中该位置的内容。有没有一种方法可以用来修复排序?有没有更好的方法呢?
答案 0 :(得分:1)
语法上这两个输出是相同的,如果你保存文件然后重新解析它,tree.write()可能会按照你想要的方式打印你的输出,但我不确定。
答案 1 :(得分:1)
试试这个,你可以根据需要打印输出。
try:
reparsed = mini.parseString(mini.parse('YOUR_FILE_NAME').toxml())
pretty_string = '\n'.join([line for line in reparsed.toprettyxml(indent=' '*4).split('\n') if line.strip()])
f = open('YOUR_FILE_NAME', 'w')
f.write(pretty_string)
finally:
f.close()
答案 2 :(得分:1)
当您将树重写到文件时,您可能需要使用pretty_print = True。也许您正在使用之前的pretty_print格式解析它,但insert()不会以pretty_print格式添加新节点。
如果您不使用LXML,我不确定这是否可行,但只需将打印更改为:
tree.write('sampleFileNew.xml',pretty_print = True)
同样,您可能需要导入lxml才能使用此功能。希望这会有所帮助。