Ich verwende Xerces, um mein XML-Dokument zu analysieren. Das Problem ist, dass xml-Zeichen wie "& amp; nbsp;" erscheinen in der Methode characters () als nicht maskierte. Ich muss maskierte Zeichen innerhalb der Methode characters () erhalten.
Danke.
UPD: Versucht, die resolveEntity-Methode im Nachkommen meines DefaultHandlers zu überschreiben. Kann von debug sehen, dass es als Entity Resolver zu XML-Reader gesetzt ist, aber Code von überschriebenen Methode wird nicht aufgerufen.
Ich denke, Ihre Lösung ist nicht zu schlecht: ein paar Zeilen Code, um genau das zu tun, was Sie wollen.
Das Problem ist, dass startEntity
und endEntity
Methoden nicht von ContentHandler
interface zur Verfügung gestellt werden, also musst du eine LexicalHandler
schreiben, die in Kombination mit deinem ContentHandler
funktioniert.
Normalerweise ist die Verwendung von XMLFilter
eleganter, aber Sie müssen mit Entity arbeiten, also sollten Sie immer noch LexicalHandler
schreiben. Sehen Sie sich hier für eine Einführung in die Verwendung von SAX-Filtern an.
Ich möchte Ihnen einen Weg zeigen, der Ihrem sehr ähnlich ist, der es Ihnen ermöglicht, Filteroperationen (z. B. Wrapping und &
) von Ausgabeoperationen (oder etwas anderem) zu trennen. Ich habe mein eigenes XMLFilter
basierend auf XMLFilterImpl
geschrieben, das auch LexicalHandler
interface implementiert. Dieser Filter enthält nur den Code, der sich auf "escape / unescape" bezieht.
Und das ist meine Hauptsache, mit einem DefaultHandler
als ContentHandler
, das die Entity so empfängt, wie es gemäß dem Filtercode ist:
Und das ist meine Ausgabe:
%Vor%Wahrscheinlich magst du es nicht, jedenfalls ist dies eine alternative Lösung.
Es tut mir leid, aber mit SaxParser
Ich denke, Sie haben keinen eleganteren Weg.
Sie sollten auch in StaxParser
wechseln: Es ist sehr einfach, das zu tun, was Sie wollen, wenn XMLInputFactory.IS_REPLACING_ENTITY_REFERENCE
auf false gesetzt ist. Wenn Ihnen diese Lösung gefällt, sollten Sie einen Blick darauf werfen hier .
Wenn Sie einen LexicalHandler als Rückruf an den SAX-Parser übergeben, informiert er Sie über den Anfang und das Ende jedes Entitätsverweises mithilfe der Rückrufe von startEntity () und endEntity ().
(Beachten Sie, dass der JavaDoc unter Ссылка spricht von "entities", wenn der korrekte Begriff "entity references" lautet.
Beachten Sie auch, dass es keinen Weg gibt, einen SAX-Parser dazu zu bringen, Ihnen numerische Zeichenreferenzen wie ሴ
zu nennen. Anwendungen sollen diese genauso behandeln wie der ursprüngliche Charakter, so dass Sie sich wirklich nicht für sie interessieren sollten.
Die vorübergehende Lösung:
%Vor%Aber brauchen immer noch elegante Lösung.