python - 让外籍人士在 python 中使用 .dtd 进行实体替换

标签 python xml entity dtd expat-parser

我正在尝试读取如下所示的 xml 文件

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE dblp SYSTEM "dblp.dtd">
<dblp>
<incollection>
<author>Jos&eacute; A. Blakeley</author>
</incollection>
</dblp>

造成问题的点是

Jos&eacute; A. Blakeley

部分:解析器调用其字符处理程序两次,一次使用“Jos”,一次使用“A. Blakeley”。 现在我明白,如果它不知道紧急实体,这可能是正确的行为。但是,这是在我拥有的 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 行)。

如果可以的话,最好使用更高级别的接口(interface),例如 SAX(通过 expatreader)。

关于python - 让外籍人士在 python 中使用 .dtd 进行实体替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2881991/

相关文章:

python - 计算第一行第一列输入的数组值

java - XML-RPC 与 java

c# - 使用 Entity Framework 跨层进行域模型设计

java - ORA-01722 : invalid number when using Hibernate

c# - Linq 是否会使后期升级应用程序的成本变得更高?

python - 从子进程调用时,Python程序将永远挂起

python - 如何使用 ruamel.yaml 正确缩进序列?

c# - 转义 XML 属性中的撇号

android - 错误 : Invalid Token

python - 我的模型是否应该始终在训练数据集上提供 100% 的准确率?