0

xml ここでは非常に初心者です。

このフォームでは非常に大きいxmlファイルがあります。

<a>
  <b>
    <id>1</id>
    ...
  </b>
  <b>
    <id>2</id>
    ...
  </b>
  <b>
    <id>3</id>
    ...
  </b>
  <b>
    <id>4</id>
    ...
  </b>
</a>

b取得したい情報がいくつかあり、Pythonのヘルプドキュメントに従おうとしています。私はこれから始めます:

#!/usr/bin/env python

import xml.etree.ElementTree as ET

tree = ET.parse('data.xml')
root = tree.getroot()

print 'root.tag = ', root.tag
print 'root.attrib = ', root.attrib

しかし、ファイルが大きすぎるため、この部分を実行するだけで数分かかります。

私がやりたいことは次のようなものです:

for node in (n for n in nodes if n.id in ['1', '3']):
  print node.val1
  print node.val2

(必要なIDに一致しないすべてのノードを処理する必要はありません)。

これを行う方法はありますか?

4

2 に答える 2

1

ElementTree は DOM に似たパーサーです。つまり、オブジェクトをナビゲートする前に、最初に XML ドキュメント全体を処理してメモリに保持します。これは、それを行う前に、完了するまで待たなければならないことも意味します。

ドキュメントが非常に大きい場合は、ドキュメントを 1 回だけ処理し、すべてを格納するわけではないSAX パーサーを調べる必要があります。

ElementTree のiterparseを利用することもできます。これは、内部構造を構築する際に、SAX パーサーと同様に、遭遇した要素に関する情報を報告します。したがって、必要な情報を以前に読み取っても、最終的には完全な ElementTree オブジェクトを取得できます。

于 2013-06-07T16:16:55.943 に答える
0

あなたがしなければならないのは、「ターゲットパーサーメソッドの使用」のようなものを使用することです例えば、lxmlを使用したPythonでの高性能XML解析

于 2013-06-07T17:22:51.080 に答える