我有以下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()实际上并不关心树结构中该位置已经存在的内容。有没有什么方法可以用来修复排序?有没有更好的方法来做这件事?
发布于 2012-10-13 02:56:27
这两个输出在语法上是相同的,如果您保存文件,然后重新解析它,tree.write()可能会以您想要的方式打印输出,尽管我不确定。
发布于 2013-12-22 20:31:22
试试这个,它会很漂亮地打印出你想要的输出。
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()
发布于 2016-05-20 01:56:54
在将树重写到文件时,看起来可能需要使用pretty_print = True。也许您正在以以前的插入形式解析它,但是pretty_print ()并没有以pretty_print形式添加您的新节点。
如果您使用的不是LXML,我不确定这是否可行,但尝试将打印内容更改为:
tree.write('sampleFileNew.xml',pretty_print = True)
同样,您可能需要导入lxml才能使用此功能。希望这能有所帮助。
https://stackoverflow.com/questions/12865244
复制相似问题