web-dev-qa-db-ja.com

PythonでXML要素の属性を設定するにはどうすればよいですか?

ElementTreeを使用してXMLファイルを作成しています。

ET.SubElement().__setattr__()を使用して要素の属性を設定しようとすると、エラーAttributeError: __setattr__が発生します。

import xml.etree.cElementTree as ET
summary = open(Summary.xml, 'w')
root = ET.Element('Summary')
ET.SubElement(root, 'TextSummary')
ET.SubElement(root,'TextSummary').__setattr__('Status','Completed') # Error occurs here
tree = ET.ElementTree(root) 
tree.write(summary)
summary.close()

コード実行後、私のXMLは次のようになります。

<Summary>
    <TextSummary Status = 'Completed'/>
</Summary>

Python using xml.etree.cElementTreeを使用してXML要素に属性を追加するにはどうすればよいですか?

8
Venkatesh

あなたはするべきです:

ET.SubElement(root,'TextSummary').set('Status','Completed')

Etreeのドキュメントには使用法が示されています

18
Thomas Orozco

キーワード引数を使用して、作成中に Element または SubElement の属性を指定できます。

import xml.etree.ElementTree as ET

root = ET.Element('Summary')
ET.SubElement(root, 'TextSummary', Status='Completed')

XML:

<Summary>
    <TextSummary Status="Completed"/>
</Summary>

または、 .set を使用して、作成後に既存の要素に属性を追加することもできます。

import xml.etree.ElementTree as ET

root = ET.Element('Summary')
sub = ET.SubElement(root, 'TextSummary')
sub.set('Status', 'Completed')

XML:

<Summary>
    <TextSummary Status="Completed"/>
</Summary>

技術的な説明:

Element および SubElement のコンストラクターには、属性をキーワード引数として受け入れる**extraが含まれます。

xml.etree.ElementTree.Element(tag, attrib={}, **extra)
xml.etree.ElementTree.SubElement(parent, tag, attrib={}, **extra)

これにより、任意の数の属性を追加できます。

root = ET.Element('Summary', Date='2018/07/02', Timestamp='11:44am')
# <Summary Date = "2018/07/02" Timestamp = "11:44am">

Use .set を使用して、既存の要素に属性を追加することもできます。ただし、これは一度に1つの要素しか追加できません。 ( Thomas Orozcoによって提案されたように )。

root = ET.Element('Summary')
root.set('Date', '2018/07/02')
root.set('Timestamp', '11:44am')
# <Summary Date = "2018/07/02" Timestamp = "11:44am">

完全な例:

import xml.etree.ElementTree as ET

root = ET.Element('school', name='Willow Creek High')
ET.SubElement(root, 'student', name='Jane Doe', grade='9')
print(ET.tostring(root).decode())
# <school name="Willow Creek High"><student grade="9" name="Jane Doe" /></school>
2
Stevoisiak