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

構文的には、これら 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 に答える