7 Stimmen

Problem beim Parsen des XML-Dokuments mit SaxParser - 2047 Zeichen Grenze?

Ich habe eine Klasse erstellt, die die SaxParser DefaultHandler-Klasse erweitert. Mein Ziel ist es, die XML-Eingabe in einer Serie von Objekten zu speichern, während die Datenintegrität der Original-XML-Daten erhalten bleibt. Während des Tests bemerkte ich, dass einige der Knotendaten willkürlich bei der Eingabe abgeschnitten wurden.

Zum Beispiel:

Eingabe: -125 Ausgabe: 5
Eingabe: 

Um die Dinge weiter zu komplizieren, treten die obigen Fehler "zufällig" bei 1 von etwa ~100 Instanzen derselben XML-Tags auf. Das bedeutet, dass die Eingabedatei ungefähr 100 Tags enthält, die -125 enthalten, aber nur einer von ihnen gibt eine Ausgabe von 5. Die anderen Tags erzeugen genau -125.

Ich habe die abstrakte Methode "characters(char[] ch, int start, int length)" überschrieben, um einfach den Zeicheninhalt zwischen XML-Tags zu erfassen:

public void characters(char[] ch, int start, int length)
            throws SAXException {

            value = new String(ch, start, length);

            //debug
            System.out.println("'" + value + "'" + "start: " + start + "length: " + length);
        }

Meine println-Anweisungen erzeugen die folgende Ausgabe für das spezifische Temperatur-Tag, das zu fehlerhafter Ausgabe führt:

> '-12'start: 2045length: 3 '5'start:
> 0length: 1

Dies sagt mir, dass die characters-Methode für dieses spezifische XML-Element zweimal aufgerufen wird. Sie wird für alle anderen XML-Tags einmal aufgerufen. Der "start"-Wert der zweiten Zeile deutet darauf hin, dass das char[] chars mitten in diesem XML-Tag zurückgesetzt wird. Und die characters-Methode wird erneut mit dem neuen char[] aufgerufen.

Ist jemand mit diesem Problem vertraut? Ich frage mich, ob ich das Limit der Kapazität eines char[] erreicht habe. Aber eine schnelle Abfrage macht dies unwahrscheinlich. Mein char[] scheint bei ~ 2047 Zeichen zurückgesetzt zu werden.

Danke,

LB

9voto

Vineet Reynolds Punkte 74302

Die Zeichenrückrufmethode muss vom SAX-Parser nicht mit einem vollständigen Datenblock bereitgestellt werden. Der Parser könnte die characters() Methode mehrmals aufrufen und jedes Mal einen Datenblock senden.

Die Lösung besteht darin, alle Daten in einem Puffer zu akkumulieren, bis der nächste Aufruf einer anderen Methode erfolgt (ein nicht-Characters-Aufruf).

3voto

desidigitalnomad Punkte 1403

Ich habe 2 ganze Tage lang nach der Lösung gesucht.

Ändern Sie Ihre characters-Methode wie folgt:

public void characters(char[] ch, int start, int length) throws SAXException {

  if(value == null)
    value = new String(ch, start, length);
  else
    value += new String(ch, start, length);

  //debug
  System.out.println("'" + value + "'" + "start: " + start + "length: " + length);

}

Und es ist geschafft!!!

0voto

user4020295 Punkte 1

Stellen Sie sicher, dass Sie value = ""; am Ende von endElementMethod hinzufügen

public void endElement( String uri, String localName, String qName ) throws SAXException 
{
    ...
    value = "";
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X