首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用python元素树将节点插入到XML中

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

Stack Overflow用户
提问于 2012-10-13 02:44:40
回答 3查看 9.4K关注 0票数 1

我有以下XML结构,如果在特定位置不存在新节点,我想添加一个新节点。

代码语言:javascript
复制
<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

代码语言:javascript
复制
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结构看起来像这样:

代码语言:javascript
复制
<root>
    <OuterLevel>
        <NewNode>
            <Name>NodeC</Name>
        </NewNode>
        <Node>
            <Name>NodeA</Name>
        </Node>
        <Node>
            <Name>NodeB</Name>
        <Node>
        <SpecialNode>
            <Name>NodeZ</Name>
        </SpecialNode>
    </OuterLevel>
 </root>

但是,它看起来像这样:

代码语言:javascript
复制
<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()实际上并不关心树结构中该位置已经存在的内容。有没有什么方法可以用来修复排序?有没有更好的方法来做这件事?

EN

回答 3

Stack Overflow用户

发布于 2012-10-13 02:56:27

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

票数 2
EN

Stack Overflow用户

发布于 2013-12-22 20:31:22

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

代码语言:javascript
复制
    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()
票数 1
EN

Stack Overflow用户

发布于 2016-05-20 01:56:54

在将树重写到文件时,看起来可能需要使用pretty_print = True。也许您正在以以前的插入形式解析它,但是pretty_print ()并没有以pretty_print形式添加您的新节点。

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12865244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档