【问题标题】:ElementTree's iterparse() XML parsing errorElementTree 的 iterparse() XML 解析错误
【发布时间】:2015-05-05 23:31:30
【问题描述】:

我需要解析一个编码为“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;

无论如何我可以解决这个问题吗?我用谷歌搜索了很多解决方案,但似乎没有一个能直接解决这个问题。

【问题讨论】:

  • 好的,您遇到了需要解决的不一致问题。在 XML 中有 &amp;umml,在错误中有 &amp;uuml。如果它们都是&amp;umml,是因为 XML 无效,需要更正。如果它们都是&amp;uuml,那么 is 是一个已定义的实体,那么应该可以工作。如果它们实际上不同,您需要提供有关该文件的更多信息。

标签: python xml


【解决方案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()

或

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?

【讨论】:

  • 不确定为什么这是公认的答案; OP 声明它是uuml,而不是umml...
  • 我看过;我只是想知道为什么这是公认的答案,因为它并没有真正以当前形式回答问题。
猜你喜欢
  • 2021-02-08
  • 1970-01-01
  • 2017-07-02
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 2021-02-06
  • 2017-08-31
  • 1970-01-01
相关资源
最近更新 更多