3

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

知道我在做什么错吗?

4

3 回答 3

1

您必须获取这些data元素的父级并使用该Element.insert(index, element)方法。

此外,您需要使用deepcopy而不仅仅是copy. 不同之处在于deepcopy创建了第二个对象,而通过使用copy(返回对象的浅表副本),您只会修改第一个元素(正如您也发现的那样)。

假设您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
于 2013-03-20T15:23:36.840 回答
1

上面例子中的“copy”和“dataElem”是从哪里来的?即copyElem =复制.deepcopy( dataElem )

于 2014-03-05T23:28:11.710 回答
0

备查。

复制节点(或树)并保留其子节点的最简单方法,而无需为此导入另一个库:

导入 xml.etree.ElementTree;

def copy_tree( tree_root ):
    return et.ElementTree( tree_root );

duplicated_node_tree = copy_tree ( node );    # type(duplicated_node_tree) is ElementTree
duplicated_tree_root_element = new_tree.getroot();  # type(duplicated_tree_root_element) is Element
于 2014-12-08T17:07:38.670 回答