【发布时间】:2019-03-24 22:40:11
【问题描述】:
在我的 S1000D xml 中,它指定了一个 DOCTYPE,其中包含对公共 URL 的引用,该 URL 包含对包含所有有效字符实体的许多其他文件的引用。我使用 xml.etree.ElementTree 和 lxml 来尝试解析它并得到一个解析错误,两者都表示:
undefined entity −: line 82, column 652
即使− 是根据实体参考指定的有效实体。
xml顶部如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dmodule [
<!ENTITY % ISOEntities PUBLIC 'ISO 8879-1986//ENTITIES ISO Character Entities 20030531//EN//XML' 'http://www.s1000d.org/S1000D_4-1/ent/ISOEntities'>
%ISOEntities;]>
如果你出去得到http://www.s1000d.org/S1000D_4-1/ent/ISOEntities,它将包括20个其他的ent文件,其中一个名为iso-tech.ent的文件包含以下行:
<!ENTITY minus "&#x2212;"> <!-- MINUS SIGN -->
在 xml 文件的第 82 行靠近第 652 列的内容如下:
....参考70&minus;41....
如何运行 python 脚本来解析这个文件而不获取未定义的实体?
对不起,例如,我不想指定 parser.entity['minus'] = chr(2212)。我这样做是为了快速修复,但有很多字符实体引用。
我希望解析器检查 xml 中指定的实体引用。
我很惊讶,但我已经绕着太阳转了又回来,还没有找到如何做到这一点(或者我可能有但无法遵循它)。
如果我更新我的 xml 文件并添加
<!ENTITY minus "&#x2212;">
它不会失败,所以它不是 xml。
解析失败。这是我用于 ElementTree 的代码
fl = os.path.join(pth, fn)
try:
root = ET.parse(fl)
except ParseError as p:
print("ParseError : ", p)
这是我用于 lxml 的代码
fl = os.path.join(pth, fn)
try:
parser = etree.XMLParser(load_dtd=True, resolve_entities=True)
root = etree.parse(fl, parser=parser)
except etree.XMLSyntaxError as pe:
print("lxml XMLSyntaxError: ", pe)
我希望解析器加载实体引用,以便它知道 - 以及所有文件中指定的所有其他字符实体都是有效的实体字符。
非常感谢您的建议和帮助。
【问题讨论】: