1

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

4

3 回答 3

2

从语法上讲,这两个输出是相同的,如果您保存文件然后重新解析它,tree.write() 可能会按照您想要的方式打印输出,尽管我不确定。

于 2012-10-12T18:56:27.040 回答
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()
于 2013-12-22T12:31:22.427 回答
1

将树重写到文件时,您可能需要使用 pretty_print = True 。也许您正在以之前的 pretty_print 形式对其进行解析,但 insert() 并未以 pretty_print 形式添加您的新节点。

如果您不使用 LXML,我不确定这是否可行,但请尝试将打印更改为:

tree.write('sampleFileNew.xml', pretty_print = True)

同样,您可能需要导入 lxml 才能使用此功能。希望这可以帮助。

于 2016-05-19T17:56:54.367 回答