4

おそらく大きな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-nsend-nsイベント、および「状態保持」変数の更新についてのみ考えることができます。これは、作業を行うためにループ内で呼び出される関数に渡す必要があります。次に、関数はそれxpathに応じてクエリを作成します。これは理にかなっていますが、これを回避するもっと簡単な方法があるのではないかと思います。

PS私は明らかに周りを検索しようとしましたが、名前空間の有無にかかわらず機能する解決策を見つけられませんでした。XMLから名前空間を削除するソリューションも受け入れますが、プロセスでツリー全体がRAMに格納されない場合に限ります。

4

1 に答える 1

2

すべての要素には.nsmapマッピング属性があります。これを使用して名前空間を検出し、それに応じて分岐します。

于 2012-09-08T17:24:23.320 に答える