2024-10-01 09:25:27 发布
网友
在elementtree的迭代期间如何替换元素?我正在为markdown编写一个treeprocessor,希望包装一个元素。在
<pre class='inner'>...</pre>
应该变成
我使用getiterator('pre')来查找元素,但我不知道如何包装它。问题是用新的包装器替换找到的元素,但将现有元素保留为子元素。在
getiterator('pre')
以我的经验,你可以用下面的方法得到你想要的:xml.etree.ElementTree.SubElement(我就叫它ET.Subelement)http://docs.python.org/2/library/xml.etree.elementtree.html#xml.etree.ElementTree.SubElement
xml.etree.ElementTree.SubElement
ET.Subelement
步骤如下: 在迭代之前,应该先获取这些迭代元素的父元素,将其存储到变量parent。在
parent
然后, 1,将元素<pre class='inner'>...</pre>存储到变量temp
temp
2,将一个新的子元素div添加到parent:
div
div = ET.SubElement(parent, 'div')
并设置div的属性:
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元素已经知道它们的父元素了。在
lxml
现在,当您从迭代中获取元素时,还可以获得父元素:
注意,我已经将迭代器从树变成了一个列表,我们不想在遍历树时修改它。那可能是个麻烦。在
最后,您可以移动元素:
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)
以我的经验,你可以用下面的方法得到你想要的:
xml.etree.ElementTree.SubElement
(我就叫它ET.Subelement
)http://docs.python.org/2/library/xml.etree.elementtree.html#xml.etree.ElementTree.SubElement步骤如下:
在迭代之前,应该先获取这些迭代元素的父元素,将其存储到变量
parent
。在然后,
1,将元素
<pre class='inner'>...</pre>
存储到变量temp
2,将一个新的子元素
div
添加到parent
:并设置
^{pr2}$div
的属性:3,将步骤1中的元素添加为
div
的子元素4,删除步骤1中的元素:
这有点棘手。首先,您需要获得this previous question中描述的父元素。在
如果您可以让markdown使用
lxml
,那么这就简单了一点,我相信lxml
元素已经知道它们的父元素了。在现在,当您从迭代中获取元素时,还可以获得父元素:
^{pr2}$注意,我已经将迭代器从树变成了一个列表,我们不想在遍历树时修改它。那可能是个麻烦。在
最后,您可以移动元素:
*请注意,我还没有完全测试过这段代码。。。如果你发现什么虫子就告诉我。在
另一个对我有用的解决方案,类似lyfing的。 将元素复制到temp中;使用所需的outer标记重新标记原始元素并清除它,然后将副本附加到原始元素中。在
相关问题 更多 >
编程相关推荐