Thread Parsen dauert ewig lange mit XML::LibXML (11 answers)
Opened by BratHering at 2009-12-25 23:57

murphy
 2009-12-26 20:05
#129727 #129727
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Ok, das ist natürlich ärgerlich, auch wenn eigentlich klar ist, warum das passiert: Wenn keine DTD geladen wird, hat der Parser keinerlei Informationen über die Bedeutung der Attribute in der XML-Datei. Da die hier vorliegende Datei global einen XML-Namensraum vorgibt, wird nun jedes Attribut, das der Parser antrifft mit dem entsprechenden Namensraumpräfix versehen, unter anderem auch die id-Attribute. Ein Attribut des vollständig qualifizierten Namens {http://www.w3.org/1999/xhtml}id ist aber etwas anderes als ein Attribut des vollständig qualifizierten Namens {http://www.w3.org/XML/1998/namespace}id und wird daher von der Methode getElementById nicht erkannt.

Fazit: Der Parser macht alles spezifikationsgetreu richtig, aber das Fehlen einer künstlichen Intelligenz, die die id-Attribute intuitiv richtig interpretieren könnte, macht sich störend bemerkbar ;-)

Mir fallen für dieses Problem mindestens zwei saubere Lösungen ein: Zum einen könnte man weiterhin die DTD des XHTML-Dokumentes ignorieren aber schlicht alle id-Attribute explizit mit dem vordefinierten Namensraumpräfix xml: versehen — es lässt sich leicht experimentell nachprüfen, dass dies das Problem behebt.

Zum anderen könnte man die LibXML anweisen durchaus die externe Dokumenttypdefinition für XHTML zu laden, in der vermerkt ist, dass id-Attribute des XHTML-Namensraumes äquivalent zu solchen des XML-Namensraumes sind, die Bibliothek aber dazu bewegen, eine lokale Kopie der DTD zu verwenden, indem man einen entsprechenden Eintrag in einen der aktiven XML-Kataloge einfügt. Unter debianartigen Linuxdistributionen geht das zum Beispiel ganz einfach systemweit durch Installation eines Paketes mit dem Namen w3c-dtd-xhtml, das die passenden DTDs enthält und einen Eintrag im systemweiten XML-Katalog hinzufügt. Die nötigen Informationen um die Katalogdateien von Hand zu modifizieren finden sich in der Dokumentation der LibXML.
When C++ is your hammer, every problem looks like your thumb.

View full thread Parsen dauert ewig lange mit XML::LibXML