2

巨大なXMLファイルがあります。ただし、この巨大なツリーの1つの小さなサブツリーにのみ関心があります。このサブツリーを解析したいのですが、その一部のみを使用する場合は、大規模なツリー全体の解析に時間を無駄にしたくありません。

理想的には、このサブツリーの先頭が見つかるまでファイルをスキャンし、サブツリーの末尾に到達するまでサブツリーを解析してから、ファイルの残りの部分をわざわざ読み取らないようにします。たぶん、私が興味を持っているサブツリーをXPath式で記述します。lxmlを使用してこれを行う方法はありますか?このメソッドを使用してこのようなことができるように見えますがiterparse()、ドキュメントに基づくと、使用したい解析済みオブジェクトが生成されないようです。助言がありますか?

(lxmlの使用は必須ではありませんが、Pythonを使用したいので、理想的には高速にしたいと思います。)

4

2 に答える 2

1

私は iterparse があなたが望むものであるという印象を受けます。http://lxml.de/parsing.htmlの「Selective tag events」セクションを見ると、あなたが望むものが得られるようです:

context = etree.iterparse(xmlfile, tag="yourSubTree")
action, elem = context.next()
etree.iterwalk(elem, ...)...

XPathも機能するようですが、XPathは戻る前にツリー全体を読み取ると思いますが、iterparseは一致するまでツリーをたどるだけだと思います。2 つのアプローチをプロファイリングする価値があります。

于 2010-03-06T00:00:40.937 に答える
0

Iterparse では、必要なサブツリーまですべてを解析する必要があります。正規表現を使用してパーサーにフィードする前に、サブツリーを抽出する方が効率的な場合があります。sax パーサーを作成してみることをお勧めします。Sax はおそらく lxml よりも遅いですが、メモリをあまり使用しないため、場合によっては優れている可能性があります。

于 2010-03-06T00:09:17.857 に答える