2011-10-29 19 views
8

*注:lxmlのは、私のシステム上で実行されません。私はlxmlに関係しない解決策を見つけることを望んでいました。PythonのXML解析

私はすでにこの辺りのドキュメントのいくつかを行っている、と私はしたいと思いますどのように動作するように、これを取得する難しさを持っています。この1に従うより「辞書」はありますが、私が操作しようとしているファイルで

<dict> 
    <key>1375</key> 
    <dict> 
     <key>Key 1</key><integer>1375</integer> 
     <key>Key 2</key><string>Some String</string> 
     <key>Key 3</key><string>Another string</string> 
     <key>Key 4</key><string>Yet another string</string> 
     <key>Key 5</key><string>Strings anyone?</string> 
    </dict> 
</dict> 

:私はこのようになりますいくつかのXMLファイルを解析したいと思います。私はXMLを読んで、次のようなテキスト/ datファイルを出力したいと思います。

1375、 "Some String"、 "Another String"、 "さらに別の文字列"、 "Strings anyone?"

...

** もともと

EOFが、私はlxmlのを使用しようとしましたが、多くの試みが、それは私のシステムで作業を取得するには後に、私はDOMを使用してに移りました。最近、Etreeを使ってこの作業を試みました。どうか、誰かがこれに沿って私を助けてくれる、良いものすべての愛のために?私はPythonには比較的新しいので、これがどのように動作するかを学びたいと思っています。私は事前に感謝します。

+1

何OSとPythonのバージョン? – Acorn

+0

番号は1375です。これは2つの異なる数字ですか?もしそうなら、どちらをお望みですか? –

答えて

10

あなたは、Pythonに含まれてxml.etree.ElementTreeを使用することができます。付属のコンパニオンC実装(つまり、はるかに高速)xml.etree.cElementTreeがあります。 lxml.etreeは機能のスーパーセットを提供しますが、あなたがしたいことには必要ありません。 @Acornによって提供さ

コードは、次の輸入のそれぞれとの私(のPython 2.7、Windows 7の)のために同じように動作します:

import xml.etree.ElementTree as et 
import xml.etree.cElementTree as et 
import lxml.etree as et 
... 
tree = et.fromstring(xmltext) 
... 

使用しているとどのようなインストールの問題は、あなたがlxmlを持っていたどのようなOS?

+0

を使用するように私の例を変更しました...最新のlxmlのインストールしようとすると、私の端末でこのメッセージを含ま4315:.2.6-1_i386.deb)... ファームウェア-B43-インストーラ(4.150.10.5-4)... PCI IDが14e4と サポートされていない低消費電力チップを設定! 中断しています。 – PleaseHelpTheNewGuy

+0

私はちょうどコードで新しいインポートを試したが、このエラーが出た:トレースバック(最近の最後の呼び出し): ファイル "/home/worky.py"、行5、 import lxml.etree as ImportError:Noモジュールlxml.etree – PleaseHelpTheNewGuy

+0

(1)あなたのUbuntuインストールの問題について:lxmlメーリングリストを試してみることをお勧めします。 (2) "lxml.etreeという名前のモジュールがありません"というのはインストールされていないからです。一度に1つのインポートのみを有効にします。他の2人をコメントアウトしてください。 –

7
import xml.etree.ElementTree as et 
import csv 

xmltext = """ 
<dicts> 
    <key>1375</key> 
    <dict> 
     <key>Key 1</key><integer>1375</integer> 
     <key>Key 2</key><string>Some String</string> 
     <key>Key 3</key><string>Another string</string> 
     <key>Key 4</key><string>Yet another string</string> 
     <key>Key 5</key><string>Strings anyone?</string> 
    </dict> 
</dicts> 
""" 

f = open('output.txt', 'w') 

writer = csv.writer(f, quoting=csv.QUOTE_NONNUMERIC) 

tree = et.fromstring(xmltext) 

# iterate over the dict elements 
for dict_el in tree.iterfind('dict'): 
    data = [] 
    # get the text contents of each non-key element 
    for el in dict_el: 
     if el.tag == 'string': 
      data.append(el.text) 
     # if it's an integer element convert to int so csv wont quote it 
     elif el.tag == 'integer': 
      data.append(int(el.text)) 
    writer.writerow(data) 
+0

すぐに投稿していただきありがとうございます。問題は、自分のマシンでlxmlを実行できないということです。私はPython 2.7を持っていて、そのモジュールをインストールしようといくつか試みましたが失敗しました。私はlxmlに関係しない別の方法があることを期待していました。 – PleaseHelpTheNewGuy

+1

実行中のOSは? – Acorn

+0

私はUbuntuのマーベリックミーアキャットのNetbook Editionを実行しているよ... – PleaseHelpTheNewGuy