おそらく大きなXMLファイルをカスタムPythonオブジェクトに解析するコードをまとめる必要があります。アイデアは大まかに次のとおりです。
from lxml import etree
for e, tag in etree.iterparse(source, tag='Foo'):
print tag.xpath('bar/baz')[42] # there's actually a function call here
問題は、一部のドキュメントには名前空間宣言があり、一部には名前空間宣言がないことです。つまり、上記のコードでは、tag='Foo'
とxpath
パーツの両方が機能しません。
今のところ私は醜いことに我慢してきました
for e, tag in etree.iterparse(source):
if tag.tag.endswith('Foo'):
print tag.xpath('*[local-name()="bar"]/*[local-name()="baz"]')[42]
しかし、これはひどいので、うまく機能していても、正しく処理したいと思います。(私もそれが遅いはずだと思います。)
を使用して両方のケースを説明する健全なコードを書く方法はありますiterparse
か?今のところ、私はキャッチstart-ns
とend-ns
イベント、および「状態保持」変数の更新についてのみ考えることができます。これは、作業を行うためにループ内で呼び出される関数に渡す必要があります。次に、関数はそれxpath
に応じてクエリを作成します。これは理にかなっていますが、これを回避するもっと簡単な方法があるのではないかと思います。
PS私は明らかに周りを検索しようとしましたが、名前空間の有無にかかわらず機能する解決策を見つけられませんでした。XMLから名前空間を削除するソリューションも受け入れますが、プロセスでツリー全体がRAMに格納されない場合に限ります。