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

2024-10-01 09:25:27 发布

您现在位置:Python中文网/ 问答频道 /正文

在elementtree的迭代期间如何替换元素?我正在为markdown编写一个treeprocessor,希望包装一个元素。在

<pre class='inner'>...</pre>

应该变成

^{pr2}$

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


Tags: 元素preclassmarkdowninnerelementtreepr2getiterator
3条回答

以我的经验,你可以用下面的方法得到你想要的:
xml.etree.ElementTree.SubElement(我就叫它ET.Subelementhttp://docs.python.org/2/library/xml.etree.elementtree.html#xml.etree.ElementTree.SubElement

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

然后,
1,将元素<pre class='inner'>...</pre>存储到变量temp

2,将一个新的子元素div添加到parent

div = ET.SubElement(parent, 'div')

并设置div的属性:

^{pr2}$

3,将步骤1中的元素添加为div的子元素

ET.SubElement(div, temp)  

4,删除步骤1中的元素:

parent.remove(temp)

这有点棘手。首先,您需要获得this previous question中描述的父元素。在

parent_map = dict((c, p) for p in tree.getiterator() for c in p)

如果您可以让markdown使用lxml,那么这就简单了一点,我相信lxml元素已经知道它们的父元素了。在

现在,当您从迭代中获取元素时,还可以获得父元素:

^{pr2}$

注意,我已经将迭代器从树变成了一个列表,我们不想在遍历树时修改它。那可能是个麻烦。在

最后,您可以移动元素:

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)

*请注意,我还没有完全测试过这段代码。。。如果你发现什么虫子就告诉我。在

另一个对我有用的解决方案,类似lyfing的。 将元素复制到temp中;使用所需的outer标记重新标记原始元素并清除它,然后将副本附加到原始元素中。在

import copy

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

相关问题 更多 >