使用python元素树将节点插入XML

时间:2012-10-12 18:44:40

标签: python xml xml-parsing python-3.x elementtree

我有以下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()实际上并不关心树结构中该位置的内容。有没有一种方法可以用来修复排序?有没有更好的方法呢?

3 个答案:

答案 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才能使用此功能。希望这会有所帮助。