簡體   English   中英

使用python元素樹將節點插入XML

[英]Inserting nodes into XML using python element tree

我有以下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()可能會按照你想要的方式打印你的輸出,雖然我不確定。

試試這個,它會很好地打印出你想要的輸出。

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

當您將樹重寫到文件時,您可能需要使用pretty_print = True。 也許您正在使用之前的pretty_print格式解析它,但insert()不會以pretty_print格式添加新節點。

如果您沒有使用LXML,我不確定這是否可行,但只需將打印更改為:

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

同樣,您可能需要導入lxml才能使用此功能。 希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM