Parse XML cadena de varias líneas en Java

Estoy tratando de analizar un atributo XML de varias líneas en Java usando el DOM clásico. El análisis está funcionando bien. Sin embargo, está destruyendo los saltos de línea, por lo que, cuando represento mi cadena analizada, los saltos de línea se reemplazan por espacios simples.

<string key="help_text" value="This is a multi line long
                               text. This should be parsed
                               and rendered in multiple lines" />

Para obtener el atributo que estoy usando:

attributes.getNamedItem("value").getTextContent()

Si solo paso una cadena escrita manualmente al método de procesamiento usando "\n", el texto se dibuja como se esperaba.

¿Alguna idea?

preguntado el 03 de mayo de 12 a las 22:05

3 Respuestas

He usado JDom para esto en el pasado. Le ahorra muchos problemas al decodificar atributos de varias líneas y realmente mejora el análisis/escritura de XML en Java. JDom también es compatible con el desarrollo de Android y es muy pequeño (solo un archivo jar).

https://github.com/hunterhacker/jdom

contestado el 04 de mayo de 12 a las 05:05

Utilicé la primera (y muy fea) solución "<br />" como una solución por ahora, pero seguramente buscaré en JDom. Muchas gracias. - david saltares

@Fsero: ¿puede describir brevemente cómo logró esto con JDom? Acabo de escribir una pequeña prueba de unidad y las nuevas líneas en los atributos se eliminan en la tierra de Xerces incluso antes de llegar a JDom. - nullPintor

Según el Especificación XML el analizador XML DEBE normalizar los espacios en blanco de atributos, como reemplazar un carácter de salto de línea con un espacio. Es decir, si necesita conservar los saltos de línea, no puede utilizar un valor de atributo.

En general, el manejo de espacios en blanco en XML es un gran problema. En particular, la diferencia entre CR, LF y CRLF no se conserva en ninguna parte.

Puede que le resulte mejor codificar saltos de línea en atributos como &lt;br /&gt; (es decir, la versión codificada de <br />) y luego decodificarlos más tarde.

contestado el 03 de mayo de 12 a las 22:05

@Ben Según la especificación XML, el procesador XML DEBE normalizar las combinaciones CR/LF a LF. - erikxiv

si precisamente Entonces, si la diferencia es importante para su aplicación, debe encontrar otra forma de codificarla: una etiqueta especial de su propia creación es el método ideal. - paquet

Desde la especificación XML: 3.3.3 Normalización de valor de atributo. Verá que todos los espacios en blanco se normalizan a espacios individuales:

Antes de que el valor de un atributo se pase a la aplicación o se verifique su validez, el procesador XML DEBE normalizar el valor del atributo aplicando el algoritmo a continuación, o usando algún otro método tal que el valor pasado a la aplicación sea el mismo que el producido. por el algoritmo. Todos los saltos de línea DEBEN haber sido normalizados en la entrada a #xA como se describe en 2.11 Manejo de fin de línea, por lo que el resto de este algoritmo opera en texto normalizado de esta manera.

Comience con un valor normalizado que consista en la cadena vacía.

Para cada carácter, referencia de entidad o referencia de carácter en el valor de atributo no normalizado, comenzando con el primero y continuando hasta el último, haga lo siguiente:

Para una referencia de carácter, agregue el carácter al que se hace referencia al valor normalizado.

Para una referencia de entidad, aplique recursivamente el paso 3 de este algoritmo al texto de reemplazo de la entidad.

Para un carácter de espacio en blanco (#x20, #xD, #xA, #x9), agregue un carácter de espacio (#x20) al valor normalizado.

Para otro carácter, agregue el carácter al valor normalizado.

contestado el 03 de mayo de 12 a las 22:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.