Как установить атрибуты для XML-элемента с помощью Python?


Я использую 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>

Как добавить атрибуты в XML-элемент с помощью Python с помощью xml.etree.cElementTree?

2 5

2 ответа:

Вы должны делать:

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

Документация по Etreeпоказывает использование .

Можно указать атрибуты для объекта Element или SubElement во время создания с аргументами ключевых слов.

import xml.etree.ElementTree as ET

root = ET.Element('Summary')
ET.SubElement(root, 'TextSummary', Status='Completed')
# <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')
# <Summary><TextSummary Status="Completed" /></Summary>

Сгенерированный XML:

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

Пояснение:

Конструкторы для Element и еще SubElement include **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 добавление атрибутов к уже существующему элементу. Однако это может добавить только один элемент за раз. ( как предложил Томас Ороско).

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>