SAX-Parser: Sonderzeichen ignorieren

8

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.

    
Alexander Oleynikov 29.03.2011, 15:42
quelle

4 Antworten

7

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.

%Vor%

Und das ist meine Hauptsache, mit einem DefaultHandler als ContentHandler , das die Entity so empfängt, wie es gemäß dem Filtercode ist:

%Vor%

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 .

    
javanna 02.04.2011, 17:55
quelle
5

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.

    
Michael Kay 29.03.2011 16:09
quelle
1

Die vorübergehende Lösung:

%Vor%

Aber brauchen immer noch elegante Lösung.

    
Alexander Oleynikov 30.03.2011 14:26
quelle
1

Es gibt noch eine weitere Möglichkeit: escapeXml Methode von org.apache.commons.lang.StringEscapeUtils class.

Versuchen Sie diesen Code in Ihrer characters(char[] ch, int start, int length) -Methode:

%Vor%

Sie können das jar hier herunterladen.

    
ag112 05.04.2011 11:46
quelle

Tags und Links