Python 如何替换树中的元素?(元素树/降价)

Python 如何替换树中的元素?(元素树/降价),python,elementtree,Python,Elementtree,如何在elementtree中的迭代过程中替换元素?我正在为markdown编写一个treeprocessor,并希望包装一个元素 <pre class='inner'>...</pre> 。。。 应该成为 <div class='wrapper'><pre class='inner'>...</pre></div> 。。。 我使用getiterator('pre')查找元素,但我不知道如何包装它。问题在于用新的包装

如何在elementtree中的迭代过程中替换元素?我正在为markdown编写一个treeprocessor,并希望包装一个元素

<pre class='inner'>...</pre>
。。。
应该成为

<div class='wrapper'><pre class='inner'>...</pre></div>
。。。

我使用
getiterator('pre')
查找元素,但我不知道如何包装它。问题在于用新的包装器替换找到的元素,但将现有元素保留为子元素。

这有点棘手。首先,需要获取中所述的父元素

如果您可以使用
lxml
进行降价,这就容易多了——我相信
lxml
元素已经知道它们的父元素了

现在,当您通过迭代获得元素时,还可以获得父元素:

for elem in list(tree.getiterator('pre')):
    parent = parent_map[elem]
    wrap_elem(parent, elem)
请注意,我已将迭代器从树转换为列表——我们不希望在对树进行迭代时修改它。那可能是个麻烦

最后,您可以移动元素:

def wrap_elem(parent, elem)
    parent_index = list(parent).index(elem)
    parent.remove(elem)
    new_elem = ET.Element('div', attrib={'class': 'wrapper'})
    parent.insert(parent_index, new_elem)
    new_elem.append(elem)

*请注意,我还没有完全测试这段代码。。。如果您发现任何bug,请告诉我。

根据我的经验,您可以使用以下方法获得所需的内容:
xml.etree.ElementTree.SubElement
(我就叫它
ET.SubElement

以下是步骤:
在迭代之前,应该首先获取这些迭代元素的父元素,并将其存储到变量
parent

然后,
1,将元素
存储到变量
temp

2、将新的子元素
div
添加到
parent
中:

div = ET.SubElement(parent, 'div')
并设置
div的属性

div.set('class','wrapper')
3,将步骤1中的元素添加为
div
的子元素

ET.SubElement(div, temp)  
4、删除步骤1中的元素:

parent.remove(temp)

另一个对我有效的解决方案,类似于lyfing的。 将该元素复制到一个temp中;用想要的外部标记重新标记原始元素并清除它,然后将副本附加到原始元素中

import copy

temp = copy.deepcopy(elem)
elem.tag = "div"
elem.set("class","wrapper")
elem.clear()
elem.append(temp)

这样的东西对一个人有用:

对于i,枚举中的元素(父项):
如果是您希望替换的元素(元素):
父级。删除(元素)
父元素。插入(i,新元素)
打破

这种方法对很多人都有效:

replacement_map={}
对于i,枚举中的元素(父项):
如果是要替换的元素(元素):
替换映射[i]=删除el到,添加el到
对于替换映射中的索引,(删除,添加):
父级。删除(el_至_删除)
parent.insert(索引,el_to_add)

这看起来应该能用。虽然我尝试了一种双重迭代的变体,迭代所有的父循环,然后迭代子循环的内部循环。我不希望第二次/以后的通行证可能无法设置所有家长。
import copy

temp = copy.deepcopy(elem)
elem.tag = "div"
elem.set("class","wrapper")
elem.clear()
elem.append(temp)