Cadena (con espacios) a DOM en Java

Tengo una función que convierte una cadena a DOM y luego usa javax.xml.xpath.XPathFactory en el objeto DOM para extraer datos.

XPathFactory funciona bien para la siguiente cadena

<root><test><name>A</name></test><test><name>B</name></test></root>

pero falla si tengo espacios entre etiquetas

<root> <test> <name>A</name> </test> <test> <name>B</name> </test></root>

Estoy usando XpathFactory para preparar los valores "A" y "B" del DOM.

¿Alguien puede decirme exactamente por qué falla XpathFactory cuando la cadena tiene espacios entre las etiquetas?

Muchas Gracias
--DAKOTA DEL SUR

preguntado el 12 de junio de 12 a las 17:06

¿Qué te hace pensar específicamente que XPathFactory está fallando? ¿Quizás quiso preguntar cómo formular una expresión XPath adecuada? -

@Rambo: Sí, cómo formular una expresión XPath adecuada (si el xml de entrada es una cadena con espacios entre etiquetas y se convierte en un DOM) -

2 Respuestas

El XPath es correcto y funciona bien, creo que el problema es que

list.item(i).getChildNodes().item(0).getTextContent());

obtiene el primer nodo secundario del nodo que coincide con XPath, que en el caso del XML con los espacios son los espacios justo después <employee>, mientras que en el caso del XML sin espacios es el <name> elemento.

En otras palabras, en el caso de los espacios, los nodos secundarios del primer employee elemento son (uno por línea):

[spaces]
<name> . . . </name>
[spaces]
<company-no> . . . </company-no>
[spaces]
<chunk-id> . . .</chunk-id>

en el caso sin espacios son:

<name> . . . </name>
<company-no> . . . </company-no>
<chunk-id> . . .</chunk-id>

y así, en el primer caso, los nodos secundarios que necesita son 1, 3 y 5, en el segundo caso son 0, 1 y 2.

Creo que deberías modificar este fragmento de código:

 System.out.println("Name: " +list.item(i).getChildNodes().item(0).getTextContent());
 System.out.println("Company: "+list.item(i).getChildNodes().item(1).getTextContent());
 System.out.println("Chunk: "+list.item(i).getChildNodes().item(2).getTextContent());

para usar otros XPaths para obtener el nombre, la empresa y los subnodos del fragmento o para omitir los nodos secundarios que contienen espacios.

Respondido el 13 de junio de 12 a las 03:06

Gracias, ¿sabes cómo funciona builder.parse()? ver línea 36 aquí ideone.com/y5WKx Creo que considera espacios/pestañas como etiquetas xml y las interpreta también en lugar de omitirlas. Corrígeme si estoy equivocado. - SDS

No se como builder.parse() funcionan, pero en general, se supone que los analizadores XML se comportan de esa manera: generar nodos en el XML analizado también para los espacios en blanco; como escribí en mi respuesta, debe cambiar la forma en que usa/procesa el resultado de XPath. - MiMo

/root/test/name

o incluso solo

//name

opcionalmente, obtenga directamente los nodos de texto secundarios

//name/text()

Respondido el 12 de junio de 12 a las 18:06

Creo que estamos en páginas diferentes. La expresión XPath que he escrito es correcta. El problema es que los espacios entre las etiquetas, como se muestra en la cadena 2, no producen el resultado correcto. Si bien ningún espacio produce el resultado requerido. - SDS

Lo siento por no dar el código antes. Aqui tienes ideone.com/ocvA1 Tenga en cuenta que la entrada String emp tiene espacios entre las etiquetas, intente omitirlos y verá que se imprimen los valores correctos: SDS

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