如何使用Python设置XML元素的属性?

Ven*_*esh 8 python xml elementtree python-2.7

我正在使用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()
Run Code Online (Sandbox Code Playgroud)

代码执行后,我的XML应该类似于以下内容:

<Summary>
    <TextSummary Status = 'Completed'/>
</Summary>
Run Code Online (Sandbox Code Playgroud)

如何使用Python向XML元素添加属性xml.etree.cElementTree

Tho*_*zco 18

你应该这样做:

ET.SubElement(root,'TextSummary').set('Status','Completed')
Run Code Online (Sandbox Code Playgroud)

Etree文档显示使用.

  • @StevenVascellaro是的:只需执行`root.set('foo', 'bar')`。 (3认同)

Ste*_*ica 10

您可以使用关键字参数在创建过程中为Element或指定属性SubElement

import xml.etree.ElementTree as ET

root = ET.Element('Summary')
ET.SubElement(root, 'TextSummary', Status='Completed')
Run Code Online (Sandbox Code Playgroud)

XML:

import xml.etree.ElementTree as ET

root = ET.Element('Summary')
ET.SubElement(root, 'TextSummary', Status='Completed')
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用.set向现有元素添加属性。

import xml.etree.ElementTree as ET

root = ET.Element('Summary')
sub = ET.SubElement(root, 'TextSummary')
sub.set('Status', 'Completed')
Run Code Online (Sandbox Code Playgroud)

XML:

<Summary>
    <TextSummary Status="Completed"/>
</Summary>
Run Code Online (Sandbox Code Playgroud)

技术说明:

ElementSubElementinclude的构造函数**extra,它接受属性作为关键字参数。

xml.etree.ElementTree.Element(tag, attrib={}, **extra)
xml.etree.ElementTree.SubElement(parent, tag, attrib={}, **extra)
Run Code Online (Sandbox Code Playgroud)

这允许您添加任意数量的属性。

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

您还可以使用 use.set向预先存在的元素添加属性。但是,这一次只能添加一个元素。(正如托马斯·奥罗斯科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">
Run Code Online (Sandbox Code Playgroud)

完整示例:

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>
Run Code Online (Sandbox Code Playgroud)