web-dev-qa-db-ja.com

elementtreeを使用してxmlファイルに要素を追加する方法

Xmlファイルがあり、それに要素を追加しようとしています。 xmlには次の構造があります:

<root>
  <OldNode/>
</root>

私が探しているのは:

<root>
  <OldNode/>
  <NewNode/>
</root>

しかし実際には次のxmlを取得しています:

<root>
  <OldNode/>
</root>

<root>
  <OldNode/>
  <NewNode/>
</root>

私のコードは次のようになります:

file = open("/tmp/" + executionID +".xml", 'a')
xmlRoot = xml.parse("/tmp/" + executionID +".xml").getroot()

child = xml.Element("NewNode")
xmlRoot.append(child)

xml.ElementTree(root).write(file)

file.close()

ありがとう。

7
Igal

追加するファイルを開いたため、最後にデータが追加されます。代わりに、wモードを使用して、書き込み用にファイルを開きます。さらに良いことに、ElementTreeオブジェクトで.write()メソッドを使用するだけです。

_tree = xml.parse("/tmp/" + executionID +".xml")

xmlRoot = tree.getroot()
child = xml.Element("NewNode")
xmlRoot.append(child)

tree.write("/tmp/" + executionID +".xml")
_

.write()メソッドを使用すると、エンコーディングを設定したり、必要に応じてXMLプロローグを強制的に書き込んだりできるという追加の利点があります。

必須開いているファイルを使用してXMLをプリティフィケーションする場合は、_'w'_モードを使用します。_'a'_は追加用のファイルを開き、観察した動作につながります。

_with open("/tmp/" + executionID +".xml", 'w') as output:
     output.write(prettify(tree))
_

ここで、prettifyは次の行に沿ったものです。

_from xml.etree import ElementTree
from xml.dom import minidom

def prettify(elem):
    """Return a pretty-printed XML string for the Element.
    """
    rough_string = ElementTree.tostring(elem, 'utf-8')
    reparsed = minidom.parseString(rough_string)
    return reparsed.toprettyxml(indent="  ")
_

例えばミニダムのかわいらしいトリック。

10
Martijn Pieters