如何向ElementTree(Python)中的子元素添加属性

如何向ElementTree(Python)中的子元素添加属性,python,attributes,lxml,elementtree,Python,Attributes,Lxml,Elementtree,我使用PY的ElementTree成功地向元素添加了一个新节点。 我现在尝试赋予它属性,但失败了,尽管我正在遵循教程 我的示例xml: <?xml version="1.0" encoding="UTF-8"?> <xml> <level01> <level02> <level03> <level04> <node q="3,4,5,7,8" p="zen"/> <node q="a,s,e,o,l" p=

我使用PY的ElementTree成功地向元素添加了一个新节点。 我现在尝试赋予它属性,但失败了,尽管我正在遵循教程

我的示例xml:

<?xml version="1.0" encoding="UTF-8"?>
<xml>
<level01>
<level02>
<level03>
<level04>
<node q="3,4,5,7,8" p="zen"/>
<node q="a,s,e,o,l" p="zen"/>
</level04>
</level03>
# >> here will be the new node, called <subi/> <<   
<level03>
<level04>
<node q="x,y" p="zen"/>
<node q="xxx,yyy" p="zen"/>
</level04>
</level03>
</level02>
</level01>
</xml>
这样就可以通过root001000访问它,并且可以读取它的标签

但我无法尝试添加属性

我尝试使用在另一个线程中找到的语法:(使用我的名字ofc)

我也直接试过,就像

subi = ETL.SubElement(root[0][0][1][0][0], 'subi', attrib={"size": "small", "gender": "unknown"})
结果总是很好

root[0][0][1][0][0][0].tag
'subi'
但是

我还发现了lxml是如何做到这一点的,但这不适用于elementtree

#Any keyword arguments of the form name=value that you supply to the constructor are added #to the element's attributes. For example, this code:

newReed = etree.Element('reed', pitch='440', id='a4')

#will produce an element that looks like this:

<reed pitch='440' id='a4'/>
#提供给构造函数的name=value形式的任何关键字参数都会添加到元素的属性中。例如,此代码:
newReed=etree.Element('reed',pitch='440',id='a4')
#将生成如下所示的元素:

我做错了什么?我怎样才能把它做好?有没有办法让elementtree做到这一点?或者我必须使用lxml吗?(哪个会被引用)?

这不是你想要做的吗?假设
subi
是您的元素并且您可以访问它,您可以进一步使用
ElementTree
方法
set

subi.set(attr, value)

查看此处有关
ElementTree的
set
方法的信息:

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

import xml.etree.ElementTree as ET

root = ET.Element('Summary')
ET.SubElement(root, 'TextSummary', Status='Completed')
# <Summary><TextSummary Status="Completed" /></Summary>
xml.etree.ElementTree.Element(tag, attrib={}, **extra)
xml.etree.ElementTree.SubElement(parent, tag, attrib={}, **extra)
生成的XML:



说明:

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>
和的构造函数包括
**extra
,它接受属性作为关键字参数

import xml.etree.ElementTree as ET

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

完整示例:

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>
将xml.etree.ElementTree作为ET导入
root=ET.Element('school',name='Willow Creek High')
ET.SubElement(根'student',name='Jane Doe',grade='9')
打印(ET.tostring(root.decode())
# 

SubElement(parent,tag,attrib={name:key})
语法对我来说很好(Python 2.7.5)。您能否提供一个简短的两级XML文档示例、确切的插入代码和结果XML输出?如下面的评论所示,我现在可以通过doint subi.attrib获得结果。不知何故,根[index].attrib确实失败了…可以使用
子元素
重复设置attrib值。OP不应该在创建新元素后设置它们(尽管这也是可能的)。我想我希望在子元素中完成,但是set看起来也可以-在我的例子中,确切的语法是什么?如果我只做subi.set(xy,“3”),它会声明名称“xy”没有定义。你应该
subi.set(“xy”,“3”)
它应该将
subi
标记为
好,这就行了。奇怪的是,现在还显示了我之前尝试设置的属性。root000101.attrib不起作用而subi.attrib起作用有什么原因吗?(假设根索引拼写正确)有趣的是,对我来说它工作正常:在设置属性和值之后,
print tree[0][0][1][0][0]。tag
gives
subi
print tree[0][0][1][0][0]。attrib
给出
{xy':'3'}
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>