【问题标题】:Parsing xml file with special characters like ü failed when I use python ElementTree当我使用python ElementTree时,解析带有ü等特殊字符的xml文件失败
【发布时间】:2016-11-09 16:11:15
【问题描述】:

xml 文件:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE dblp SYSTEM "dblp.dtd">
<dblp>
<title>Schnelle Multiplikation von Polynomen &uuml;ber K&ouml;rpern der Charakteristik 2.</title>
</dblp>

我用 python 传递这个文件如下,我还有一个 .dtd 文件:

import xml.etree.ElementTree as ET
tree=ET.parse(r"../data/test_dblp.xml")
root=tree.getroot()

for i in range(0,9):
    print root[0][i].text

报错:

xml.etree.ElementTree.ParseError: 未定义实体 '&uuml';

【问题讨论】:

  • dblp.dtd 中有什么内容?那里定义了像&amp;uuml; 这样的实体吗?
  • 我没有找到 ü在 .dtd 文件中。但我确实知道 ü代表一些拉丁字符。
  • &amp;uuml;html 实体(对于 ü),而不是 xml,因此除非实体在 dtd 中明确声明,否则您的 xml 无效。
  • dblp XML 导出中的所有命名实体都在随附的 dblp.dtd 文件中定义,请参阅dblp.org/xml。不过,您必须确保在 Python 脚本的路径中找到与系统相关的 DTD 文件。

标签: python xml dtd


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

【讨论】:

  • 我不明白这如何解决任何问题...if key == 'umml',然后您将其设置为该值,它已经等于?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
  • 2012-09-30
  • 1970-01-01
相关资源
最近更新 更多