Python ElementTree - 插入元素的副本

标签 python xml

我有以下 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/

相关文章:

Python - 如何将字符串从二进制转换为整数列表?

python - 类型错误 : write() got an unexpected keyword argument 'context' - Odoo v8 to Odoo v10 community

javascript - (不允许的方法)外部 xml 到 json

java - 使用 JDOM 处理 Java 中的字符实体 : how to?

python - 两个图像相减

python - PyObjC 的 NSString 方法问题

python - 需要删除列表中的所有重复值

xml - 使用 Sweet Lime 实现 apigee 代理容易吗?

c# - Visual C# 在 Appdata 中存储和读取自定义 XML 中的自定义选项

xml - DTD 解析 : Parameter entity reference name including another parameter entity reference - is it well formed?