让expat在python中使用.dtd替换实体

2024-09-29 21:38:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着读入一个如下所示的xml文件

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

造成问题的原因是

^{pr2}$

part:解析器调用它的字符处理程序两次,一次用“Jos”,一次用“A.Blakeley”。 现在我明白了,如果它不知道每个实体,这可能是正确的行为。但是,这在数据库.dtd,我有。不过,我似乎无法说服expat使用这个文件。我只能说

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)

但外派还是不认识我的实体。为什么不能告诉expat使用哪个DTD?我试过了

  • 将文件放入与XML相同的目录中
  • 将文件放入程序的工作目录中
  • 用绝对路径替换xml文件中的引用

我错过了什么?谢谢。在


Tags: 文件实体目录versionxmlencodingauthordtd
2条回答

顺便说一句,我可以暂时帮助自己将.dtd的相关部分复制到XML文件中,如

<!DOCTYPE dblp [
    <!ENTITY Agrave  "&#192;" >
]>

但这并不能真正解决问题。在

据我所知,如果您直接使用pyexpat,那么您必须提供自己的ExternalEntityRefHandler来获取外部DTD并将其提供给expat。在

示例代码请参见示例xml.sax.expatreader(方法external_entity_ref,Python2.6中的第374行)。在

如果可以的话,最好使用更高级的接口,比如SAX(viaexpatreader)。在

相关问题 更多 >

    热门问题