Ver Mensaje Individual
  #2 (permalink)  
Antiguo 02/06/2012, 18:50
Avatar de zerokilled
zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: Javascript y los saltos de linea en xml

buenas.
lo primero, comprender como funciona un navegador. probablemente sabrás y se te habrá olvidado que el navegador omite los saltos de línea y los convierte a espacio. adicionalmente, más de un caracter whitespace consecutivo es ignorado y solo se muestra uno.

segundo, cuando generas el xml le estas dando unos elementos al documento xml. es decir, en tu resultado final, <br> son elementos del documento xml y no los considera como texto. por tanto, es normal que cuando el navegador ‒ o cualquier otro programa compatible con xml ‒ lee el primer nodo del elemento solo obtenga la primera porción. fíjate que no es lo mismo crear el xml con dichos elementos neutralizado, es decir convertir los símbolos < > a &lt; y &gt;. en todo caso, aunque los neutralices, no te va servir porque al agregar el contenido del nodo (appendChild) el navegador no analiza su contenido y por tanto lo agrega como un contenido literal.

tercero, el problema de que te aparece dos <br> lo tendrás que consultar en su respectivo foro. adivinando un poco, asumo que debe ser que la función nl2br admite ambas formas de saltos de líneas: LF y CR. probablemente tu navegador ‒ o del usuario que pública el texto ‒ generó ambos caracteres.

solución al problema. hay múltiples formas de hacerlo funcionar. todo dependerá de cuál forma tu quieres hacerlo. si quieres trabajar directamente a base de nodos, entonces puedes crear varios subelementos en el documento xml. por ejemplo, generar un resultado como el siguiente:
Código:
<noticia>
   <texto>
     <parag>nada<parag>
     <parag>hola que tal</parag>
   </texto>
</noticia>
luego, para agregar el contenido debes recorrer por los elementos del elemento <texto> y en cada ciclo crear un nuevo elemento.

Código:
var destino, texto; // destino: elemento html donde se va agregar, texto: elemento xml que contiene el contenido

for(var i = 0; texto.childNodes[i]; i++ ){
if(texto.childNodes[i].nodeType != 1) continue; // verificamos que sea de tipo Element;
var p = document.createElement('p');
  p.appendChild(
  document.createTextNode(texto.childNodes[i].firstChild.nodeValue)
  );
destino.appendChild(p);
}
la otra alternativa es usando el método que haz estado usando hasta ahora pero ligeramente con unas diferencias. primero, al generar el documento xml debes poner el contenido dentro de un CDATASection. de esta forma el interprete xml no considera los elementos sino que lo trata como un contenido literal y así al leer el nodo con firstChild obtienes todo el contenido. y segundo, en lugar de appendChild debes usar innerHTML para que el navegador analice el contenido como html.

Código:
// xml;
<noticia>
   <texto><![CDATA[
     nada
       <br>
       <br>
     hola que tal
   ]]></texto>
</noticia>

// js;
var p = document.createElement('p');
p.innerHTML = texto.firstChild.nodeValue;
destino.appendChild(p);
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.

Última edición por zerokilled; 03/06/2012 a las 04:18 Razón: error de codigo