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