我有以下 xml 代码:
<data factor="1" name="ini" value="342" />
我想复制相同的信息,但名称不同。即,最终输出应该是:
<data factor="1" name="ini" value="342" />
<data factor="1" name="raw_ini" value="342" />
我尝试执行以下操作:
model_tag = tree.findall(data_path) #I make sure that data_path is correct.
len_tags = len(model_tag)
i = 0
while i < len_tags:
tipo_tag = model_tag[i]
if tipo_tag.attrib['name']=='ini':
aux_tag = copy.deepcopy(tipo_tag) #I tried also with copy.copy(tipo_tag).
aux_tag.attrib['name'] = 'raw_ini'
model_tag.append(aux_tag)
tree.write(dir_output)
如果我使用“copy.deepcopy”,我就没有额外的元素。输出是:
<data factor="1" name="ini" value="342" />
如果我使用“copy.copy”,只需更改元素的名称。输出是:
<data factor="1" name="raw_ini" value="342" />
知道我做错了什么吗?
最佳答案
您必须获取那些 data
元素的父级并使用 Element.insert(index, element)
方法。
此外,您需要使用deepcopy
而不仅仅是copy
。不同之处在于 deepcopy
创建了第二个对象,而通过使用 copy
(它返回对象的 shallow 副本)你将只是修改第一个元素(正如您所想的那样)。
假设您将 dataParent
作为 data
元素的父元素。
listData = dataParent.findall('data')
lenData = len(listData)
i = 0
while i < lenData:
if listData[i].attrib['name'] == 'ini':
copyElem = copy.deepcopy(dataElem)
copyElem['name'] = 'raw_ini'
dataParent.insert([index you wish], copyElem)
i += 1
关于Python ElementTree - 插入元素的副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15527399/