让外籍人士在 python 中使用 .dtd 进行实体替换
-
04-10-2019 - |
题
我正在尝试读取如下所示的 xml 文件
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE dblp SYSTEM "dblp.dtd">
<dblp>
<incollection>
<author>José A. Blakeley</author>
</incollection>
</dblp>
造成问题的点看起来是
José A. Blakeley
部分:解析器调用其字符处理程序两次,一次使用“Jos”,一次使用“A.布莱克利”。现在我明白,如果它不知道紧急实体,这可能是正确的行为。但是,这是在我拥有的 dblp.dtd 中定义的。不过,我似乎无法说服外籍人士使用此文件。我只能说
p = xml.parsers.expat.ParserCreate()
# tried with and without following line
p.SetParamEntityParsing(xml.parsers.expat.XML_PARAM_ENTITY_PARSING_ALWAYS)
p.UseForeignDTD(True)
f = open(dblp_file, "r")
p.ParseFile(f)
但外籍人士仍然不认识我的实体。为什么没有办法告诉外籍人士使用哪个 DTD?我试过了
- 将文件放入与 XML 相同的目录中
- 将文件放入程序的工作目录中
- 将 xml 文件中的引用替换为绝对路径
我缺少什么?谢谢。
解决方案
据我了解,如果您直接使用 pyexpat,那么您必须提供自己的 ExternalEntityRefHandler
获取外部 DTD 并将其提供给 expat。
参见例如。 xml.sax.expatreader
例如代码(方法 external_entity_ref
, ,Python 2.6 中的第 374 行)。
使用更高级别的接口(例如 SAX)可能会更好(通过 expatreader
) 如果可以的话。
其他提示
顺便说一句,我可以通过将 .dtd 的相关部分复制到 XML 文件本身来暂时帮助自己,如下所示
<!DOCTYPE dblp [
<!ENTITY Agrave "À" >
]>
但这并不能真正解决一般问题。
不隶属于 StackOverflow