Hello everyone,
I've written this little program that refuses to work:
from lxml import etree
if __name__ == "__main__":
xml_input = "C:\Desarrollo\pythontests\lxml\foo.xml"
parser = etree.XMLParser(load_dtd = True, dtd_validation = True,
attribute_defaults = True)
doc = etree.parse(xml_input, parser)
Here's the traceback.
Traceback (most recent call last):
File "C:\Desarrollo\pythontests\lxml\dtd_loader.py", \
line 27, in <module> doc = etree.parse(xml_input, parser)
File "lxml.etree.pyx", line 2515, in lxml.etree.parse
File "parser.pxi", line 1755, in lxml.etree._parseDocument
File "parser.pxi", line 1759, in lxml.etree._parseDocumentFromURL
File "parser.pxi", line 1681, in lxml.etree._parseDocFromFile
File "parser.pxi", line 826 ,in lxml.etree._BaseParser._parseDocFromFile
File "parser.pxi",line 450,in lxml.etree._ParserContext._handleParseResultDoc
File "parser.pxi", line 534, in lxml.etree._handleParseResult
File "parser.pxi", line 476, in lxml.etree._raiseParseError
lxml.etree.XMLSyntaxError: failed to load external entity "NULL",
line 9, column 83
This is a snippet of foo.xml :
<?xml version="1.0" encoding="iso-8859-1" ?>
<!DOCTYPE rem:requirementsProject
SYSTEM "C:\Desarrollo\pythontests\lxml\foo.dtd">
...
Then, I tried to write a custom resolver.
from lxml import etree
class DTDResolver(etree.Resolver):
def resolve(self, url, id, context):
print("Resolving (url, %s)(id, %s)"% (url,id))
self.resolve_filename("C:\Desarrollo\pythontests\lxml\JENSEN.dtd", \
context)
if __name__ == "__main__":
parser = etree.XMLParser(load_dtd = True, dtd_validation = True,
attribute_defaults = True)
parser.resolvers.add(DTDResolver())
xml_input = "C:\Desarrollo\pythontests\lxml\foo.xml"
doc = etree.parse(xml_input, parser)
But it still fails (same traceback).
What am I doing wrong?
BTW, lxml version is 2.0.1.
Thanks in advance.