Verwenden von Python und lxml zum Überprüfen von XML anhand einer externen DTD

Ich versuche, eine XML-Datei anhand einer externen DTD zu validieren, auf die im Tag doctype verwiesen wird. Speziell:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE en-export SYSTEM "http://xml.evernote.com/pub/evernote-export3.dtd">
...the rest of the document...

Ich benutze Python 3.3 und das LXML-Modul. Aus dem Lesenhttp://lxml.de/validation.html#validation-at-parse-timeIch habe das zusammen geworfen:

enexFile = open(sys.argv[2], mode="rb") # sys.argv[2] is the path to an XML file in local storage.
enexParser = etree.XMLParser(dtd_validation=True)
enexTree = etree.parse(enexFile, enexParser)

Nach meinem Verständnis von validation.html sollte sich die lxml-Bibliothek nun darum kümmern, die DTD abzurufen und die Validierung durchzuführen. Aber stattdessen verstehe ich Folgendes:

$ ./mapwrangler.py validate notes.enex
Traceback (most recent call last):
  File "./mapwrangler.py", line 27, in <module>
    enexTree = etree.parse(enexFile, enexParser)
  File "lxml.etree.pyx", line 3239, in lxml.etree.parse (src/lxml/lxml.etree.c:69955)
  File "parser.pxi", line 1769, in lxml.etree._parseDocument (src/lxml/lxml.etree.c:102257)
  File "parser.pxi", line 1789, in lxml.etree._parseFilelikeDocument (src/lxml/lxml.etree.c:102516)
  File "parser.pxi", line 1684, in lxml.etree._parseDocFromFilelike (src/lxml/lxml.etree.c:101442)
  File "parser.pxi", line 1134, in lxml.etree._BaseParser._parseDocFromFilelike (src/lxml/lxml.etree.c:97069)
  File "parser.pxi", line 582, in lxml.etree._ParserContext._handleParseResultDoc (src/lxml/lxml.etree.c:91275)
  File "parser.pxi", line 683, in lxml.etree._handleParseResult (src/lxml/lxml.etree.c:92461)
  File "parser.pxi", line 622, in lxml.etree._raiseParseError (src/lxml/lxml.etree.c:91757)
lxml.etree.XMLSyntaxError: Validation failed: no DTD found !, line 3, column 43

Das überrascht mich, denn wenn ich die Validierung ausschalte, wird das Dokument einwandfrei analysiert und ich kann es tunprint(enexTree.docinfo.doctype) bekommen

$ ./mapwrangler.py validate notes.enex
<!DOCTYPE en-export SYSTEM "http://xml.evernote.com/pub/evernote-export3.dtd">

Für mich scheint es also kein Problem zu sein, die DTD zu finden.

Danke für Ihre Hilfe.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage