2009-09-29 6 views
6

Ho creato una classe che estende la classe DefaultHandler di SaxParser. Il mio intento è quello di memorizzare l'input XML in una serie di oggetti preservando l'integrità dei dati XML originali. Durante il test, ho notato che alcuni dei dati del nodo venivano troncati arbitrariamente in input.Problema Analisi del documento XML usando SaxParser - Limite di 2047 caratteri?

Ad esempio:

Input: <temperature>-125</temperature> Output: <sensitivity>5</sensitivity> 
Input: <address>101_State</city>    Output: <address>te</address> 

a complicare ulteriormente le cose, gli errori di cui sopra si verifica "a caso" per 1 su ogni ~ 100 istanze degli stessi tag XML. Il significato del file XML di input è di circa 100 tag che contengono <temperature>-125</temperature> ma solo uno di essi produce un'uscita di <sensitivity>5</sensitivity>. Gli altri tag producono esattamente <sensitivity>-125</sensitivity>.

ho sovrascritto i "caratteri (char [] ch, int start, int lunghezza)" astratte metodo per semplice afferrare il contenuto carattere tra tag XML:

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); 
     } 

mie istruzioni println producono il seguente output per il tag temperatura specifica che si traduce in uscita erronea:

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

questo mi dice che i metodi di caratteri che viene chiamato due volte per questo specifico elemento XML. Viene chiamato una volta per tutti gli altri tag xml. Il valore "start" della linea di sicurezza mi indica che i caratteri char [] vengono ripristinati nel mezzo di questo tag XML. E il metodo dei caratteri viene richiamato di nuovo con il nuovo carattere [].

Qualcuno ha familiarità con questo problema? Mi stavo chiedendo se stavo raggiungendo il limite della capacità di un personaggio []. Ma una query veloce rende questo improbabile. Il mio char sembra [] per essere il ripristino a ~ 2047 caratteri

Grazie,

LB

risposta

8

Il characters callback method non sia necessario fornire con un pezzo completo dei dati da parte del parser SAX. Il parser potrebbe invocare il metodo characters() più volte, inviando una porzione di dati alla volta.

The resolution is to accumulate all the data in a buffer, fino a quando la chiamata successiva avviene con un altro metodo (una chiamata senza caratteri).

+0

grazie. Sembra che questo suggerimento sia corretto. –

+0

Risposta corretta. Un'altra possibilità da considerare è quella di passare all'utilizzo del parser Stax (javax.xml.stream.XMLStreamReader) e abilitare la "modalità coalescenza", che offre prestazioni elevate simili a SAX, ma senza dover ricorrere manualmente al testo. – StaxMan

3

Ho trascorso 2 giorni interi a cercare la soluzione.

Cambia i tuoi personaggi metodo per questo:

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); 

} 

E il suo fare !!!

0

Assicurati di aggiungere value = ""; alla fine del endElementMethod

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