2017-06-16 84 views
0

我试图放置几个(现有的)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;不会移动,也不会移动,也不会移动。

回答

0

您正在搜索的<root>元以下,但你使用路径“根/ B”,这不匹配。 for循环得到一个空列表并且什么都不做。


编辑:这个解决方案适用于lxml ElementTree的实现只,移动行为不适用于其他情况下,是指在这种情况下其他的答案。

在LXML,您不必删除b,追加不复制的元素的元素。

fA = root.find("a") 
for b in root.findall("b"): 
    fA.append(b) 
+0

如果不删除'B',输出树不会是正确的。 –

+0

@LancelodLiu你真的尝试过吗?追加到其他地方为我移动元素。 –

+0

谢谢mwil.me.请参阅Lancelod的回答下的评论。你的代码工作得很好,但是它保留了两次b元素(一次是引导孩子,然后是一个副本)。 行'root.remove(b)'效果很好,只能删除原来的b元素。 – Helen

0

root.findall()从 '根' 开始,试试这个:

findingA = root.find('a') 
for b in root.findall('b'): 
    findingA.append(b) 
    root.remove(b) 
+0

什么版本的'lxml'正在运行?我得到“ValueError:元素不是这个节点的孩子。”有了这个。 –

+0

我也用lxml得到这个错误。但是这个问题被标记为“elementtree”,而不是“lxml”,所以假设OP不使用lxml似乎是合理的。 – mzjn

+0

@mzjn我们不是在谈论lxml.etree吗? –