Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用lxml解析DTD路径_Python_Lxml_Dtd_Resolver - Fatal编程技术网

Python 使用lxml解析DTD路径

Python 使用lxml解析DTD路径,python,lxml,dtd,resolver,Python,Lxml,Dtd,Resolver,我有一套DTD,内部称为其他DTD。所有这些文件当前都存储在我的项目的主目录中。我的项目开始看起来非常阻塞,所以我希望将DTD移到一个新文件夹中。我找到了一种使用类似于上的解析器解析主文件DTD路径的方法。问题在于,尽管它正确解析了主DTD的路径,但它似乎两次解析了内部调用文件的路径。因为此路径不存在,所以代码会出错 我的解析器: class DTDResolver(etree.Resolver): def resolve(self, system_url, public_id, con

我有一套DTD,内部称为其他DTD。所有这些文件当前都存储在我的项目的主目录中。我的项目开始看起来非常阻塞,所以我希望将DTD移到一个新文件夹中。我找到了一种使用类似于上的解析器解析主文件DTD路径的方法。问题在于,尽管它正确解析了主DTD的路径,但它似乎两次解析了内部调用文件的路径。因为此路径不存在,所以代码会出错

我的解析器:

class DTDResolver(etree.Resolver):
    def resolve(self, system_url, public_id, context):
        print system_url
        newPath = "DTDs/" + system_url
        return self.resolve_filename(newPath, context)
结果如下:

us-patent-grant-v40-2004-12-02.dtd
DTDs/wipo.ent
Traceback (most recent call last):
  File "lxml.etree.pyx", line 3032, in lxml.etree.fromstring (src/lxml/lxml.etree.c:68121)
  File "parser.pxi", line 1786, in lxml.etree._parseMemoryDocument (src/lxml/lxml.etree.c:102470)
  File "parser.pxi", line 1674, in lxml.etree._parseDoc (src/lxml/lxml.etree.c:101299)
  File "parser.pxi", line 1074, in lxml.etree._BaseParser._parseDoc (src/lxml/lxml.etree.c:96481)
  File "parser.pxi", line 582, in lxml.etree._ParserContext._handleParseResultDoc (src/lxml/lxml.etree.c:91290)
  File "parser.pxi", line 683, in lxml.etree._handleParseResult (src/lxml/lxml.etree.c:92476)
  File "parser.pxi", line 622, in lxml.etree._raiseParseError (src/lxml/lxml.etree.c:91772)
lxml.etree.XMLSyntaxError: failed to load external entity "DTDs/DTDs/wipo.ent", line 237, column 7
我能够创建一个工作环境,但它看起来非常粗糙,所以我想知道是否有更好的方法来解决这个问题

class DTDResolver(etree.Resolver):
    def resolve(self, system_url, public_id, context):
        print system_url
        if system_url.startswith("DTDs/"):
            return self.resolve_filename(system_url, context)
        else:
            newPath = "DTDs/" + system_url
            return self.resolve_filename(newPath, context)

您是否考虑过更正DTD中的系统标识符,以便相对引用仍然正确?还是说这不可行?我已经考虑过了,而且现在是可行的,但我不确定将来会怎样。在我看来,现在解决这个问题更加实际,因为每次位置改变或我得到一个新的DTD时,我都不必手动修复单个文件