2017-10-26 6 views
1

私はPythonとXMLの世界で少し新しいです。私は必死にあなたの助けが必要です、私はこのプロジェクトを終了する時間が割れている!基本的に私はxmlファイルをExcelにインポートする前に詳しく説明する必要があります。次のように私のXMLは、(非常に小さいエキス)構成されている:私がする必要がどのような要素ノードは削除しますが、Pythonを使用して子ファイルをXMLファイルに保存するにはどうすればよいですか?

<?xml version="1.0" encoding="UTF-8"?> 
<Application> 
    <first/> 
    <second> 
     <third/> 
     <third/> 
     <third/> 
    </second> 
</Application> 

は、xmlファイル(ElementTreeのかlxmlの)を解析すると、このような何かを得るために、<first/><second/>を排除することです。

<?xml version="1.0" encoding="UTF-8"?> 
<Application> 
     <third/> 
     <third/> 
     <third/>  
</Application> 

私はすでに読んで、基本的に私は見つけることができるすべての関連の質問をしようとしたが、私は達成するために管理されているすべては、全体<first/>要素を排除することだったしています。

私はPython 3.6.2を使用していますが、標準ライブラリが推奨されています(lxml、elementtree)。

ご協力いただきありがとうございます。

+0

へようこそを読むことができます。 [ツアー]をご覧ください。また、[What topics about about](http://stackoverflow.com/help/on-topic)、[ask]、[mcve]の作成方法を確認することもできます。試したコードと受け取ったエラーを投稿してください。できるだけ具体的にすることで、より良い回答につながります。必要なxmlに加えて使用しているコードを表示 – happymacarts

+0

https://stackoverflow.com/questions/23498394/remove-a-node-from-etree-but-leaving-child –

+0

ありがとう@ABDUL NIYAS PM、しかし私はalraedyがそれを試みた。私が持っている問題は、私はxmlファイルを解析する必要がある、私は手動でpythonスクリプトの中にコピーすることはできません。何をお勧めしますか?言い換えれば、リンクしたソリューションにコードが表示されている場合、どうすれば "オープン... with ... ..."を組み合わせることができますか? – Luke

答えて

1

究極のタスクが与えられた例では、親を削除することです。(アプリケーション - ルート、まず、seond - ノード、サードinner_nodes) )

1)あなたのXMLを読み込む(そしてあなたがここに検討したノードを見つけます'アプリケーション')

2)として、あなたのツリー

3)ここでは '第三' の名前を持つすべてのinner_nodes(ノード取得)

ためinner_nodes(TREE-> nodes-> inner_nodes)のリストを取得します

4)ルートの直下の子を削除する - 'Applicaiton'

5)すべてのinner_nodesをルートに追加してください!

yourxmlfile.txt

<?xml version="1.0" encoding="UTF-8"?>\n<Application>\n <first/>\n <second>\n  <third/>\n  <third/>\n  <third/>\n </second>\n</Application> 

そして、あなたはあなたのxmlファイルの小枝のtree.parse()SO

>>> import xml.etree.ElementTree as etree 
>>> root=etree.parse('yourxmlfile.xml') 
>>> etree.tostring(root) 
b'<Application>\n <first />\n <second>\n  <third />\n  <third />\n  <third />\n </second>\n</Application>' 
>>> inner_nodes=[node.getchildren() for node in root.getchildren()] 
>>> print(inner_nodes) 
[[], [<Element 'third' at 0x10c272818>, <Element 'third' at 0x10c2727c8>, <Element 'third' at 0x10c272778>]] 
>>> for node in root.getchildren():root.remove(node) 
... 
>>> etree.tostring(root) 
b'<Application>\n </Application>' 
>>> [[root.append(c) for c in child] for child in filter(None,inner_nodes)] 
[[None, None, None]] 
>>> etree.tostring(root) 
b'<Application>\n <third />\n  <third />\n  <third />\n </Application>' 
+0

入力いただきありがとうございますが動作しません。あなたはそれを文字列にすることなくそれをする方法を知っていますか? – Luke

+0

私は印刷以外の場所では文字列にしません。私はetree.parse()を使用しました!あなたが得るエラーのトレースバックを共有することはできますか? –