2011-01-11 27 views
5

Estoy codificando un lector RSS en Javascript usando XMLHttpRequest.Leyendo la sección XML CDATA con]] en él

Para algunos RSS Feeds No he tenido problemas, pero en algunos casos el atributo xmlDocument.firstChild estaba siempre NULL

Después de tratar de ver las diferencias entre el XML que funcionaba y los que no trabajé me encontré con que la siguiente es la causa del error.

<item> 
    <description> 
     <![CDATA[This is a description for a test [...]]]> 
    </description> 
</item> 

Debido a que en esta descripción de la etiqueta Tengo un corchete de cierre seguida de los soportes de cierre de la CDATA es la causa de mi error, he hecho un código en C# usando LINQ para el mismo XML y todo funcionaba.

El corchete de cierre que está justo antes de los corchetes de cierre de CDATA está causando este extraño comportamiento. Como prueba, intenté leer el mismo XML usando C# y LINQ, todo funcionó bien.

Luego he intentado añadir un espacio entre los paréntesis de cierre, como la siguiente

<![CDATA[This is a description for a test [...] ]]>

y funcionó!

mi código Javascript

function LoadRSS() { 
    http_request.onreadystatechange = function() { showContent(http_request); }; 
    http_request.open("GET", "./feeds/test.xml", true); 
    http_request.send(false); 
} 


function showContent(http_request) { 
    if (http_request.readyState == 4) { 
     if (http_request.status == 200) { 
      var parser = new DOMParser(); 
      var xml_doc = parser.parseFromString(http_request.responseText, "text/xml"); 
      alert(xml_doc.firstChild) 
     } 
     else { 
      xml_doc = null; 
     } 
    } 
} 

¿Alguien se han enfrentado a algo similar? Ahora que realmente no sé cómo proceder, cualquier comentario y sugerencia son bienvenidos.

+1

Parece ser un error en el analizador XML. ¿Qué OS/navegador/versión estás usando? – Phrogz

+0

El navegador se llama OBIGO, es un navegador para teléfonos celulares – YasuDevil

+1

Sí, navegador roto. La sección CDATA puede contener combinaciones ']]'; solo lleno ']]>' lo finaliza. – StaxMan

Respuesta

5

Cualquier navegador que esté utilizando parece estar analizando incorrectamente las secciones de CDATA; solo ]]> marca el final de la sección, los demás corchetes no deberían afectar a esto en absoluto.

+0

Bueno, reemplazar los soportes probablemente resolverá mi problema. Intentaré ejecutar el mismo código en otro navegador para ver qué sucede. – YasuDevil

+1

La primera parte es correcta, la segunda incorrecta: sí, puede incluir entidades, pero no se analizarán, pero se incluirán exactamente como están. Entonces no puedes usar entidades para citar nada. – StaxMan

+1

@StaxMan: Lo siento, malinterpreté esa sección; solo se refiere a los valores de los atributos, no a las secciones genéricas de CDATA. @YasuDevil: supongo que mi solución no funcionará después de todo. – casablanca

1

En cuanto a "cómo proceder" ... ¿por qué no incluir siempre un espacio antes del final del bloque CDATA siempre? ¿No tienes control sobre el XML generado? Si es así, puede usar JS para:

var xml = http_request.responseText.replace(/\]\]>/g, ' ]]>'); 
var xml_doc = parser.parseFromString(xml, "text/xml"); 
+0

Sí, es una buena solución, gracias a todos – YasuDevil