2

lxmlとiterparseメソッドを使用してパーサーを作成し、多くの項目を含む非常に大きなxmlファイルをステップスルーしようとしています。

私のファイルの形式は次のとおりです。

<item>
  <title>Item 1</title>
  <desc>Description 1</desc>
  <url>
     <item>http://www.url1.com</item>
  </url>
</item>
<item>
  <title>Item 2</title>
  <desc>Description 2</desc>
  <url>
     <item>http://www.url2.com</item>
  </url>
</item>

これまでのところ、私の解決策は次のとおりです。

from lxml import etree

context = etree.iterparse( MYFILE, tag='item' )

for event, elem in context :
      print elem.xpath( 'description/text( )' )
      elem.clear( )
      while elem.getprevious( ) is not None :
            del elem.getparent( )[0]

del context

それを実行すると、次のようなものが得られます。

[]
['description1']
[]
['description2']

空白のセットは、urlタグの子であるアイテムタグも取得するためであり、xpathで抽出する説明フィールドがないことは明らかです。私の望みは、各項目を1つずつ解析してから、必要に応じて子フィールドを処理することでした。私はlxmlライブラリを学んでいるだけなので、サブアイテムを残したままメインアイテムを引き出す方法があるかどうか知りたいのですが。

4

1 に答える 1

4

とにかく、xml全体はコア実装によって解析されます。etree.iterparseは、ジェネレータースタイルの単なるビューであり、タグ名による単純なフィルタリングを提供します(docstring http://lxml.de/api/lxml.etree.iterparse-class.htmlを参照)。複雑なフィルタリングが必要な場合は、独自に行う必要があります。

解決策:開始イベントへの登録も:

iterparse(self, source, events=("start", "end",), tag="item")

そして、あなたが「item」の終わりにいるとき、あなたが「item / url / item」の終わりにいるときを知るために、ブール値を持っています。

于 2011-08-25T00:28:23.120 に答える