使用python elemen将节点插入XML

2024-09-22 18:18:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下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()实际上并不关心树结构中已经位于该位置的内容。有什么方法可以帮我解决订货问题吗?有更好的办法吗?


Tags: namenodetreerootxmletnewnodenodea
3条回答

试试这个,它会很漂亮地按你的要求打印输出。

    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()

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

当您将树重写到文件时,可能需要使用pretty_print=True。也许您在以前的pretty_print表单中解析它,但是insert()不会在pretty_print表单中添加新节点。

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

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

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

相关问题 更多 >