ElementTree的iterparse()XML解析错误

时间:2013-09-17 03:41:41

标签: python xml

我需要解析一个编码为“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行,并犯了一个错误。这是“& uuml;”没有空间。我为此道歉。

此代码正常工作,直到它在XML文件中遇到如下所示的行:

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

我猜这意味着苏黎世,但解析器似乎并不知道这一点。

运行上面的代码给了我一个错误:

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

无论如何我能解决这个问题吗?我已经搜索了很多解决方案,但似乎没有人直接解决这个问题。

1 个答案:

答案 0 :(得分:1)

请尝试以下操作:

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()

OR

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()

相关问题:Python ElementTree support for parsing unknown XML entities?