如何在元素树中迭代期间替换元素?我正在为markdown编写一个树处理器,并希望包装一个元素.
...
应该成为
...
我getiterator('pre')
用来查找元素,但我不知道如何包装它.问题点是用新的包装器替换找到的元素,但保留现有元素作为子包装.
这有点棘手.首先,您需要获取上一个问题中描述的父元素.
parent_map = dict((c, p) for p in tree.getiterator() for c in p)
如果你可以降价使用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)
*请注意,我没有完全测试此代码...如果您发现任何错误,请告诉我.