2009-10-02 19 views
5

構造化されたマークアップデータの大きなファイル(> 5GB)を解析しようとしています。データ形式は基本的にXMLですが、明示的なルート要素はありません。それを行う最も効率的な方法は何ですか?Pythonで大規模な疑似XMLファイルを解析する

SAXパーサーの問題は、ルート要素を必要とするため、データストリームに擬似要素を追加するか(PythonのJavaのSequenceInputStreamと同じですか?)、またはSAXに準拠しないイベントベースのパーサー(sgmllibの後継者はありますか)

データの構造は非常に単純です。要素の基本的なリスト:

<Document> 
    <docid>1</docid> 
    <text>foo</text> 
</Document> 
<Document> 
    <docid>2</docid> 
    <text>bar</text> 
</Document> 

*実際にあなたがxml.sax.parseに 'ストリーム' オブジェクトを渡すことができ

答えて

11

http://docs.python.org/library/xml.sax.html

注意を反復処理します。これはおそらくparse呼び出しにファイルのようなメソッド(例えばreadのような)を持つオブジェクトを渡すことができることを意味します。自分のオブジェクトを作成します。最初にあなたの仮想ルートの開始タグを置き、次にファイルの内容、終了タグ。私はreadメソッドを実装する必要があると思う...しかし、これはあなたが使用するサックスパーサーに依存するかもしれません。私の作品

例:

import xml.sax 
import xml.sax.handler 

class PseudoStream(object): 
    def read_iterator(self): 
     yield '<foo>' 
     yield '<bar>' 
     for line in open('test.xml'): 
      yield line 
     yield '</bar>' 
     yield '</foo>' 

    def __init__(self): 
     self.ri = self.read_iterator() 

    def read(self, *foo): 
     try: 
      return self.ri.next() 
     except StopIteration: 
      return '' 

class SAXHandler(xml.sax.handler.ContentHandler): 
    def startElement(self, name, attrs): 
     print name, attrs 

d = xml.sax.parse(PseudoStream(), SAXHandler()) 
+0

'復帰 ''' StopIteration'に行うには、 '本当に正しいことですか?そのコードのクライアントが 'read()'だけを使用した場合、どのようにEOFに気付くでしょうか? –

+4

Pythonのストリーム型オブジェクトのプロパティの1つは、read()呼び出しが少なくとも1バイトをブロックして返すか、EOFの場合に空の文字列を返すことです。これが元のfile.readメソッドの仕組みです。 – liori

+1

これはPullDOMと組み合わせて使用​​することをお勧めします。これはSAXのストリーミング性とDOMの階層性を組み合わせたものです。 – RichieHindle

1

は、迅速かつ汚い答えは(Stringとして)ルート要素を追加することになるので、それが有効なXMLになります。

よろしくお願いいたします。

1

+0

張氏 - 良い答え。私はそれをupvotedしました。 –

+0

私はあなたと約束した100ポイントはどこですか? –

0

xml.parsers.expat ..ルート要素を追加し、SAX、STAXまたはVTD-XMLを使用する - 進出を用いた高速XML解析 xml.parsers.expatモジュールは、Expatの非へのPythonインタフェースです検証XMLパーサ。このモジュールは、XMLパーサーの現在の状態を表す1つの拡張タイプxmlparserを提供します。 xmlparserオブジェクトが作成された後、オブジェクトのさまざまな属性をハンドラ関数に設定できます。 XML文書がパーサに送られると、XML文書の文字データとマークアップに対してハンドラ関数が呼び出されます。

さらに詳しい情報:http://www.python.org/doc/2.5/lib/module-xml.parsers.expat.html

関連する問題