Gibt es eine Möglichkeit, wenn ich ein XML-Dokument mit lxml analysieren, um dieses Dokument anhand einer externen Katalogdatei gegen seine DTD zu validieren? Ich muss in der Lage sein, die festen Attribute zu bearbeiten, die in der DTD eines Dokuments definiert sind.Verwenden eines XML-Katalogs mit Pythons LXML?
Antwort
Können Sie ein Beispiel geben? Laut der lxml validation docs kann lxml DTD-Validierung (im XML-Dokument oder extern in Code angegeben) und Systemkataloge, die die meisten Fälle deckt, die ich mir vorstellen kann.
f = StringIO("<!ELEMENT b EMPTY>")
dtd = etree.DTD(f)
dtd = etree.DTD(external_id = "-//OASIS//DTD DocBook XML V4.2//EN")
es, dass lxml scheint nicht diese libxml2 Funktion aussetzen, greppen die Quelle taucht nur einige #defines für die Fehlerbehandlung: der catalog implementation in libxml2 page
C:\Dev>grep -ir --include=*.px[id] catalog lxml-2.1.1/src | sed -r "s/\s+/ /g"
lxml-2.1.1/src/lxml/dtd.pxi: catalog.
lxml-2.1.1/src/lxml/xmlerror.pxd: XML_FROM_CATALOG = 20 # The Catalog module
lxml-2.1.1/src/lxml/xmlerror.pxd: XML_WAR_CATALOG_PI = 93 # 93
lxml-2.1.1/src/lxml/xmlerror.pxd: XML_CATALOG_MISSING_ATTR = 1650
lxml-2.1.1/src/lxml/xmlerror.pxd: XML_CATALOG_ENTRY_BROKEN = 1651 # 1651
lxml-2.1.1/src/lxml/xmlerror.pxd: XML_CATALOG_PREFER_VALUE = 1652 # 1652
lxml-2.1.1/src/lxml/xmlerror.pxd: XML_CATALOG_NOT_CATALOG = 1653 # 1653
lxml-2.1.1/src/lxml/xmlerror.pxd: XML_CATALOG_RECURSION = 1654 # 1654
lxml-2.1.1/src/lxml/xmlerror.pxi:CATALOG=20
lxml-2.1.1/src/lxml/xmlerror.pxi:WAR_CATALOG_PI=93
lxml-2.1.1/src/lxml/xmlerror.pxi:CATALOG_MISSING_ATTR=1650
lxml-2.1.1/src/lxml/xmlerror.pxi:CATALOG_ENTRY_BROKEN=1651
lxml-2.1.1/src/lxml/xmlerror.pxi:CATALOG_PREFER_VALUE=1652
lxml-2.1.1/src/lxml/xmlerror.pxi:CATALOG_NOT_CATALOG=1653
lxml-2.1.1/src/lxml/xmlerror.pxi:CATALOG_RECURSION=1654
Von es möglich scheint, dass die ‚transparent‘ Die Handhabung durch die Installation in/etc/xml/catalog funktioniert möglicherweise noch in lxml, aber wenn Sie mehr als das benötigen, können Sie lxml immer abbrechen und die Standard-Python-Bindings verwenden, die die Katalogfunktionen verfügbar machen.
Sie können den Katalog der XML_CATALOG_FILES
Umgebungsvariable hinzu:
os.environ['XML_CATALOG_FILES'] = 'file:///to/my/catalog.xml'
this thread See. Beachten Sie, dass Einträge in XML_CATALOG_FILES
durch Leerzeichen getrennte URLs sind. Sie können Pythons pathname2url
und urljoin
(mit file:
) verwenden, um die URL aus einem Pfadnamen zu generieren.