2011-09-07 6 views
5

私はdetailed hereとしてXMLファイルを解析するためのPythonコードを持っています。私は、XMLファイルがメモリ内で操作されたときにシステムリソースを消費することで有名であることを理解しています。私のソリューションは、より小さいXMLファイル(200KBと340MBのファイルがあります)で動作します。XMLファイルをPythonで簡単に分割する方法は?

私はStAX(プルパーサー)の実装を研究し始めましたが、私は厳しいスケジュールで実行しています。私はこの作業のためのもっと簡単なアプローチを探しています。

私はファイルの小さな塊の作成を理解していますが、毎回main/headerタグを出力して正しい要素を抽出するにはどうすればよいですか?例えば

、これはスキーマです:

<?xml version="1.0" ?> 
<!--Sample XML Document--> 
<bookstore> 
    <book Id="1"> 
     .... 
     .... 
    </book> 
    <book Id="2"> 
     .... 
     .... 
    </book> 
    <book Id="3"> 
     .... 
     .... 
    </book> 
    .... 
    .... 
    .... 
    <book Id="n"> 
     .... 
     .... 
    </book> 
</bookstore> 

どのように私はすべて1000個のbook要素のためのヘッダデータを使用して新しいXMLファイルを作成するのですか?コードとデータセットの具体例については、私の他のquestion hereを参照してください。どうもありがとう。

私がやりたいことは、データセットのメモリ内ロードを一度に避けることです。ストリーミング形式でXMLファイルを解析できますか?私は正しい線に沿って考えていますか?

p.s:私の状況は2009年のquestion askedに似ています。私の問題の解決策が見つかったら、ここに回答を投稿します。あなたのフィードバックは高く評価されます。

答えて

8

することができますparse your big XML file incrementally:まだ

from xml.etree.cElementTree import iterparse 

# get an iterable and turn it into an iterator 
context = iter(iterparse("path/to/big.xml", events=("start", "end"))) 

# get the root element 
event, root = next(context) 
assert event == "start" 

for event, elem in context: 
    if event == "end" and elem.tag == "book": 
     # ... process book elements ... 
     root.clear() 
2

elementtree.iterparseを使用して、各ブックタグを処理した後に破棄することができます。

+1

より良い、パフォーマンスの向上のために使用するlxmlののetree(http://lxml.de/tutorial.html)。 – six8

+1

@Cixate:解析が必要なときに 'cElementTree.iterparse()'が 'lxml.etree.iterparse()'より遅いかどうかは、ベンチマークなしでは不明です。http://www.ibm.com/developerworks/xml /ライブラリ/ x-hiperfparse / – jfs

関連する問題