代码之家  ›  专栏  ›  技术社区  ›  Nicolas78

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

  •  1
  • Nicolas78  · 技术社区  · 14 年前

    我正在尝试读取一个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文件中的引用替换为绝对路径

    我错过了什么?谢谢。

    2 回复  |  直到 13 年前
        1
  •  1
  •   bobince    14 年前

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

    参见 xml.sax.expatreader 例如代码(方法 external_entity_ref ,python 2.6中的第374行)。

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

        2
  •  0
  •   Nicolas78    14 年前

    顺便说一句,我可以通过将.dtd的相关部分复制到XML文件本身来临时帮助自己,如

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

    但这并不能从一般的角度解决问题。