3

「ISO-8859-1」のエンコーディングを持つ 1.2GB の XML ファイルを解析する必要があります。NET に関するいくつかの記事を読んだ後、Python の ElementTree の iterparse() が SAX 解析よりも優先されるようです。

テストするためだけに非常に短いコードを書きましたが、解決方法がわからないエラーが表示されます。

私のコード (Python 2.7):

from xml.etree.ElementTree import iterparse

for (event, node) in iterparse('dblp.xml', events=['start']):
    print node.tag
    node.clear()

編集:ああ、ファイルが本当に大きくてラグがあったので、XML 行を入力して間違えました。「ü」です。スペースなし。申し訳ありません。

このコードは、XML ファイル内で次のような行に到達するまで正常に機能します。

<Journal>Technical Report 248, ETH Z&uuml;rich, Dept of Computer Science</Journal>

これはチューリッヒを意味すると思いますが、パーサーはこれを認識していないようです。

上記のコードを実行すると、エラーが発生しました。

xml.etree.ElementTree.ParseError: undefined entity &uuml;

この問題を解決できる方法はありますか? 私はかなりの数の解決策をグーグルで検索しましたが、この問題に直接対処しているようには見えません。

4

1 に答える 1

2

以下を試してください:

from xml.etree.ElementTree import iterparse, XMLParser
import htmlentitydefs

class CustomEntity:
    def __getitem__(self, key):
        if key == 'umml':
            key = 'uuml' # Fix invalid entity
        return unichr(htmlentitydefs.name2codepoint[key])

parser = XMLParser()
parser.parser.UseForeignDTD(True)
parser.entity = CustomEntity()

for (event, node) in iterparse('dblp.xml', events=['start'], parser=parser):
    print node.tag
    node.clear()

また

from xml.etree.ElementTree import iterparse, XMLParser
import htmlentitydefs

parser = XMLParser()
parser.parser.UseForeignDTD(True)
parser.entity = {'umml': unichr(htmlentitydefs.name2codepoint['uuml'])}

for (event, node) in iterparse('dblp.xml', events=['start'], parser=parser):
    print node.tag
    node.clear()

関連する質問:未知の XML エンティティを解析するための Python ElementTree サポート?

于 2013-09-17T06:15:07.387 に答える