2009-09-29 9 views
6

He creado una clase que amplía la clase SaxParser DefaultHandler. Mi intención es almacenar la entrada XML en una serie de objetos mientras se preserva la integridad de los datos de los datos XML originales. Durante la prueba, noté que algunos de los datos del nodo se truncaban arbitrariamente en la entrada.Issue Parsing XML Document using SaxParser - ¿límite de 2047 caracteres?

Por ejemplo:

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

Para complicar más las cosas, los errores anteriores se produce "al azar" para 1 de cada ~ 100 instancias de los mismos etiquetas XML. Lo que significa que el archivo XML de entrada tiene aproximadamente 100 etiquetas que contienen <temperature>-125</temperature> pero solo una de ellas produce una salida de <sensitivity>5</sensitivity>. Las otras etiquetas producen exactamente <sensitivity>-125</sensitivity>.

me han sobrescrito los "caracteres (char [] ch, de inicio, int longitud)" abstractos método hasta la simple apropiación del contenido de caracteres entre las etiquetas 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); 
     } 

Mis sentencias println producen el siguiente resultado para la etiqueta de temperatura específica que resulta en la producción errónea:

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

esto me dice que los métodos de caracteres que se ha llamado dos veces para este elemento XML específico. Se está llamando una vez para todas las demás etiquetas xml. El valor de "inicio" de la línea secundaria me indica que los caracteres char [] se restablecen en el medio de esta etiqueta XML. Y el método de caracteres se vuelve a llamar con el nuevo carácter [].

¿Alguien está familiarizado con este problema? Me preguntaba si estaba llegando al límite de la capacidad de un char []. Pero una consulta rápida hace que esto sea poco probable. Mi char [] parece estar restablecer a ~ 2047 caracteres

Gracias,

LB

Respuesta

8

El characters callback method no necesita estar provisto de una porción completa de datos por parte del analizador SAX. El analizador podría invocar el método de caracteres() varias veces, enviando un fragmento de datos a la vez.

The resolution is to accumulate all the data in a buffer, hasta que la siguiente llamada pase a otro método (una llamada sin caracteres).

+0

gracias. Parece que esta sugerencia es correcta. –

+0

Respuesta correcta. Otra posibilidad a considerar es cambiar al uso del analizador Stax (javax.xml.stream.XMLStreamReader), y habilitar el "modo coalescente": esto ofrece un alto rendimiento similar al SAX, pero sin tener que fusionar manualmente el texto. – StaxMan

3

Pasé 2 días enteros buscando la solución.

Cambiar los caracteres método para esto:

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

} 

Y su hecho !!!

0

Asegúrese de que añade value = ""; al final de endElementMethod

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