我有以下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()实际上并不关心树结构中已经位于该位置的内容。有什么方法可以帮我解决订货问题吗?有更好的办法吗?
试试这个,它会很漂亮地按你的要求打印输出。
从语法上讲,这两个输出是相同的,tree.write()可能会按照您想要的方式打印您的输出,如果您保存文件,然后重新分析它,尽管我不确定。
当您将树重写到文件时,可能需要使用pretty_print=True。也许您在以前的pretty_print表单中解析它,但是insert()不会在pretty_print表单中添加新节点。
如果您不使用LXML,我不确定这是否可能,但尝试将打印更改为:
tree.write('sampleFileNew.xml',pretty_print=True)
同样,您可能需要导入lxml才能使用此功能。希望这有帮助。
相关问题 更多 >
编程相关推荐