web-dev-qa-db-ja.com

python xml.etree.ElementTreeサブ要素に追加

Xml.etree.ElementTreeを使用してxmlファイルを解析し、特定のタグを見つけ、そのタグに子を追加し、新しく作成されたタグに別の子を追加し、後者の子にテキストを追加しようとしています。

私のXML:

<root>
<a>
    <b>
      <c>text1</c>
    </b>
    <b>
      <c>text2</c>
   </b>
</a>
</root>    

必要なXML:

<root>
<a>
    <b>
      <c>text1</c>
    </b>
    <b>
      <c>text2</c>
   </b>
    <b>
      <c>text3</c>
   </b>
</a>
</root>

現在のコード:

import xml.etree.ElementTree as ET
tree = ET.parse('test.xml')
root = tree.getroot()


for x in root.iter():
    if (x.tag == 'a'):
        ET.SubElement(x, 'b')
        ET.SubElement(x, 'c')
        #add text

これは、「c」が「b」ではなく「a」の子として追加されることを除いて、機能しているようです。

そのようです:

<root>
<a>
    <b>
      <c>test1</c>
    </b>
    <b>
      <c>test2</c>
    </b>
  <b /><c/></a>
</root>

また、新しく作成された要素「c」にテキストを追加するにはどうすればよいですか?テキストのないタグ「c」が見つかるまで繰り返すことができますが、もっと良い方法があるはずです。

8
andrsnn

bの親要素としてcを指定する必要があります。

また、aタグを取得するためにループは必要ありません。ルート(a)を取得するだけです。

import xml.etree.ElementTree as ET

tree = ET.parse('test.xml')
root = tree.getroot()

a = root.find('a')
b = ET.SubElement(a, 'b')
c = ET.SubElement(b, 'c')
c.text = 'text3'

print ET.tostring(root)

プリント:

<root>
    <a>
        <b>
          <c>text1</c>
        </b>
        <b>
          <c>text2</c>
        </b>
        <b>
          <c>text3</c>
        </b>
    </a>
</root>
12
alecxe

テキストを追加するための独自の関数を定義することを好みます。

def SubElementWithText(parent, tag, text):
    attrib = {}
    element = parent.makeelement(tag, attrib)
    parent.append(element)
    element.text = text
    return element

これは、次のように使用すると非常に便利です。

import xml.etree.ElementTree as ET

tree = ET.parse('test.xml')
root = tree.getroot()

a = root.find('a')
b = ET.SubElement(a, 'b')
c = SubElementWithText(b, 'c', 'text3')
2
Yonatan Simson