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」が見つかるまで繰り返すことができますが、もっと良い方法があるはずです。
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>
テキストを追加するための独自の関数を定義することを好みます。
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')