ElementTree中的位移元素(将元素嵌套到并行元素中)
我试图放置几个(现有的)XML元素< b>成平行元件< A&#x003E ;,从而ElementTree中的位移元素(将元素嵌套到并行元素中)
<root>
<a/>
<b id="one"/>
<b id="two"/>
</root>
变得
<root>
<a>
<b id="one"/>
<b id="two"/>
</a>
</root>
我曾尝试这样的:
findingA = root.find('a')
for b in root.findall('root/b'):
findingA.append(b)
root.remove(b)
但这些该死&#x003C; B&# x003E;不会移动,也不会移动,也不会移动。
您正在搜索的<root>
元以下,但你使用路径“根/ B”,这不匹配。 for循环得到一个空列表并且什么都不做。
编辑:这个解决方案适用于lxml
ElementTree的实现只,移动行为不适用于其他情况下,是指在这种情况下其他的答案。
在LXML,您不必删除b
,追加不复制的元素的元素。
fA = root.find("a")
for b in root.findall("b"):
fA.append(b)
root.findall()
从 '根' 开始,试试这个:
findingA = root.find('a')
for b in root.findall('b'):
findingA.append(b)
root.remove(b)
什么版本的'lxml'正在运行?我得到“ValueError:元素不是这个节点的孩子。”有了这个。 –
我也用lxml得到这个错误。但是这个问题被标记为“elementtree”,而不是“lxml”,所以假设OP不使用lxml似乎是合理的。 – mzjn
@mzjn我们不是在谈论lxml.etree吗? –
如果不删除'B',输出树不会是正确的。 –
@LancelodLiu你真的尝试过吗?追加到其他地方为我移动元素。 –
谢谢mwil.me.请参阅Lancelod的回答下的评论。你的代码工作得很好,但是它保留了两次b元素(一次是引导孩子,然后是一个副本)。 行'root.remove(b)'效果很好,只能删除原来的b元素。 – Helen