2009-06-02 8 views
6

Supongamos que obtener la siguiente estructura XML:Cómo acceder nodo de texto XML en Jquery

<root> 
<item> 
<item1>text1</item1> 
<item2>text2</item2> 
more text here 
</item> 
</root> 

"más texto aquí" es un nodo de texto que está en el mismo nivel que los otros nodos de datos en la jerarquía, pero no parece ser accesible.

¿Hay alguna manera de extraer el nodo de texto mostrado arriba utilizando las funciones jQuery?

+0

Uso .html() en lugar de .text() y obtendrás los contenidos brutos. –

+3

excepto .html() no está disponible para xml – safoo

Respuesta

6

me ocurrió con la misma solución:

var xml = $("<root><item1>text1</item1><item2>text2</item2>more text here</root>"); 
    alert($(xml).contents().empty().end().text()); 
4

Así que la solución que se me ocurrió es eliminar los nodos item1 y item2 dejando sólo el texto:

$(responseXML).find('item').each(function(){ 
     var item1_text = $(this).find('item1').text(); 
     var item2_text = $(this).find('item2').text(); 

     $(this).contents().empty(); //removes the other nodes 

     var extra_text = $(this).text(); 

    } 
4

Use el contenido () función. Por ejemplo, si usted tiene un fragmento de XML como:

var root = $('<root><item1>text1</item1><item2>text2</item2>more text here</root>'); 

Entonces usted puede conseguir en el texto a través de:

var txt = root.contents()[2] 

Esto es suponiendo que el nodo de texto es siempre el tercero hijo de < raíz > . De lo contrario, si no conocer la posición, o puede tener un nodo que contiene varios nodos de texto, que debe recoger todos los nodos de texto mediante el filtrado:

var textList = root.contents().filter(function() { return this.nodeType == 3; }); 

Esto devuelve una matriz de nodos de texto que se encuentra en el fragmento XML Para acceder a las cadenas de la lista, simplemente acceda al segmento de la matriz:

var txt = textList[0]; 
+0

¿Probó su código antes de publicarlo? Ninguno de los ejemplos que ha publicado funciona. –

+0

Sí, acabo de volver a probar cortando y pegando en jquery 1.3.2. Dado que todas estas son asignaciones variables, Firebug no imprimirá nada si solo corta y pega, tiene que repetir el eco, o simplemente omitir la asignación. – johnvey

+0

+1 para solución no destructiva. – Niklas

0

Esto obtendrá el valor de raíz/texto adecuado. El texto puede colocarse en todas partes en el nodo raíz.

<script type="text/javascript"> $().ready(function() { var xml = $('#xml').find('root').contents().each(function(i){ if (this.nodeName=="#text" && this.nodeType=="3" && this.nodeValue.length>2) alert(this.nodeValue); }); });
</script>

para:

<div id="xml"><root><item1>text1</item1><item2>text2</item2>more text here</root></div> 

Nota: "en línea" xml no funciona en Internet Explorer, pero si se reemplaza la raíz y itemX en el ejemplo con nombres de nodo HTML válido, que funcionará también.

Explicación: DOM trata los nodos vacíos y de texto como elementos. Si se depura el .Cada anterior(), verá lo siguiente:

alert(this.nodeName + '|' + this.nodeType + "|" + this.nodeValue); 

#text|3| , ITEM1|1|null , #text|3| , ITEM2|1|null , #text|3| more text here 

(En este momento, el formato no está funcionando con un teclado húngaro, todavía)

Cuestiones relacionadas