2017-06-16 62 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嗎? –