2017-06-16 15 views
0

私はいくつかの(既存の)XML要素を配置しようとしていますが、#x003C; b>並列要素&#x003Cに; 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; findallでもiterでも動かないでしょう。

答えて

0

<root>要素の下を検索していますが、一致しないパス "root/b"を使用しています。 forループは空のリストを取得し、何もしません。


編集:このソリューションは唯一lxmlにおけるElementTreeの実装に適用され、移動の挙動は、その場合の他の回答を参照してください、それ以外の場合には適用されません。

lxmlでは、要素bを削除する必要はありません。追加すると要素がコピーされません。 「ルート」から

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

を、出力ツリーは右ではありません。 –

+0

@LancelodLiu実際にこれを試しましたか?他のどこかを追加すると、私の要素が移動します。ありがとうmwil.me。 –

+0

Lancelodの答えの下で私のコメントを見てください。あなたのコードはうまく動作しますが、b要素を2回残しています(1回は子供を指示し、次にaをaの中にコピーします)。 'root.remove(b)'行はうまく動作し、元のb要素だけを削除します。 – Helen

0

root.findall()開始は、この試してください:あなたは 'B'を削除しない場合

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

実行中の 'lxml'のバージョンは?私は "ValueError:Elementはこのノードの子ではありません。"これとともに。 –

+0

私はlxmlでそのエラーも受け取ります。しかし質問には "lxml"ではなく "elementtree"とタグ付けされているので、OPがlxmlを使用していないと仮定することは合理的です。 – mzjn

+0

@mzjn私たちはlxml.etreeについて話していませんか? –

関連する問題