Как установить атрибуты для 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 ответа:
Вы должны делать:
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>