2010-06-06 174 views
18

Soy un principiante en el desarrollo web, y estoy tratando de insertar saltos de línea en mi archivo XML. Esto es lo que se ve mi XML como:salto de línea en XML?

<musicpage> 
    <song> 
     <title>Song Title</title> 
     <lyric>Lyrics</lyric> 
    </song> 

    <song> 
     <title>Song Title</title> 
     <lyric>Lyrics</lyric> 
    </song> 

    <song> 
     <title>Song Title</title> 
     <lyric>Lyrics</lyric> 
    </song> 

    <song> 
     <title>Song Title</title> 
     <lyric>Lyrics</lyric> 
    </song> 
</musicpage> 

Quiero tener saltos de línea entre las sentencias por las letras. Intenté todo desde/n, y otros códigos similares a él, análisis de PHP, etc. ¡y nada funciona! Ha estado buscando en línea en línea durante horas y parece que no puede encontrar la respuesta. Estoy usando el XML para insertar datos en una página HTML usando Javascript.

¿Alguien sabe cómo resolver este problema?

Y este es el código JS que se utiliza para insertar los datos XML a la página HTML:

<script type="text/javascript"> 

    if (window.XMLHttpRequest) { 
    xhttp=new XMLHttpRequest(); 
} else { 
    xhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
} 
xhttp.open("GET","xml/musicpage_lyrics.xml",false); 
xhttp.send(""); 
xmlDoc=xhttp.responseXML; 

var x=xmlDoc.getElementsByTagName("songs"); 
for (i=0;i<x.length;i++) { 
    document.write("<p class='msg_head'>"); 
    document.write(x[i].getElementsByTagName("title")[0].childNodes[0].nodeValue); 
    document.write("</p><p class='msg_body'>"); 
    document.write(x[i].getElementsByTagName("lyric")[0].childNodes[0].nodeValue); 
    document.write("</p>"); 
} 
</script> 
+0

Por favor, publique un código que muestre cómo está utilizando el XML. –

+1

¿Puedes aclarar una cosa? ¿Tiene problemas para compilar el archivo XML (si lo abre en un editor de texto estúpido, ve lo que espera ver?) O tiene problemas para representar el texto en el navegador. Mi sospecha es que el problema es que los navegadores representan CUALQUIER espacio en blanco (espacios, pestañas, saltos de línea, etc.) como un único espacio, por lo que el problema no es el XML, sino el texto. Necesita agregar '
' (observe la barra inclinada) para hacer que se visualice en el navegador o debe escribirlo en un bloque '

'. –
                        
                            
    Andrew
                                
                            
                        
                    

+0

El XML es más o menos lo que publiqué en la parte superior de la página, y he agregado el código Javascript que utilicé para insertar los datos XML en la página HTML (por si acaso es necesario). – ew89

Respuesta

24

@icktoofay estaba cerca con el CData

<myxml> 
    <record> 
     <![CDATA[ 
     Line 1 <br /> 
     Line 2 <br /> 
     Line 3 <br /> 
     ]]> 
    </record> 
</myxml> 
+0

FUNCIONA PERFECTAMENTE !!!Muchas gracias, exactamente lo que estaba buscando :) – ew89

+1

Dado que está utilizando CDATA, ¿por qué necesita los saltos de línea reales? –

+0

Saltos de línea no son necesarios ... Simplemente los puse allí para mostrar los descansos. Se puede reducir fácilmente a una sola línea. –

1

Si utiliza CDATA, se podría integrar los saltos de línea directamente en el código XML que pienso. Ejemplo:

<song> 
    <title>Song Title</title> 
    <lyric><![CDATA[Line 1 
Line 2 
Line 3]]></lyric> 
</song> 
+0

Lo probé, pero el archivo XML simplemente no se cargaba en la página HTML (lo que resulta en un espacio en blanco donde se supone que se debe cargar el XML) :( – ew89

+1

Esto funciona perfectamente bien sin CDATA. – Tomalak

7

Al final de sus líneas, sólo tiene que añadir el siguiente carácter especial: &#xD;

Ese carácter especial define el carácter de retorno de carro.

+0

Lo intenté también , pero el código simplemente no aparece en la página HTML, como un salto de línea y como tipeo literal, pero el resto de los datos XML se carga perfectamente. – ew89

+3

@ ew89: Los saltos de línea en el código fuente no causan saltos de línea en HTML procesado. Para HTML, usted quiere las etiquetas '
' – Tomalak

+1

@Scorchin: Puede usar un salto de línea literal simple. No hay necesidad de codificarlo excepto en valores de atributo. – Tomalak

2
<song> 
    <title>Song Tigle</title> 
    <lyrics> 
    <line>The is the very first line</line> 
    <line>Number two and I'm still feeling fine</line> 
    <line>Number three and a pattern begins</line> 
    <line>Add lines like this and everyone wins!</line> 
    </lyrics> 
</song> 

(Sung por una suma de Hogar en la gama)

Si era mío me gustaría envolver los coros y versos en elementos XML también.

+0

¡No es una mala idea, pero es demasiado prolija! CDATA funciona bien aquí. – fastcodejava

+0

@fastcodejava: ¿Eres un tipo Java y me dices que esto es detallado? :) Nah, no es lo suficientemente detallado. Como mencioné en mi edición, también envuelve coros y versos. – Robusto

22

En XML, un salto de línea es un carácter normal. Usted puede hacer esto:

<xml> 
    <text>some text 
with 
three lines</text> 
</xml> 

y el contenido de <text> será

 
some text 
with 
three lines 

Si esto no funciona para usted, usted está haciendo algo mal. Las "soluciones temporales" especiales como la codificación del salto de línea son innecesarias. Cosas como \n no funcionarán, por otro lado, porque XML no tiene secuencias de escape *.


* Tenga en cuenta que &#xA; es la entidad de caracteres que representa un salto de línea en serializado XML. "XML no tiene secuencias de escape" significa la situación cuando interactúa con un documento DOM, estableciendo valores de nodo a través de la DOM API.

Esto es donde ni &#xA; ni cosas por el estilo \n funcionará, sino una real carácter de nueva línea hará. La forma en que este personaje termina en el documento serializado (es decir, "archivo") depende de la API y no debería preocuparle.


ya que parece que preguntarse dónde están sus saltos de línea van en HTML: Tome una mirada en el código fuente, ahí están. HTML ignora los saltos de línea en el código fuente. Use las etiquetas <br> para forzar saltos de línea en la pantalla.

Aquí es una función de JavaScript que inserta <br> en una cadena de múltiples líneas:

function nl2br(s) { return s.split(/\r?\n/).join("<br>"); } 

Alternativamente se puede forzar saltos de línea en caracteres de nueva línea con CSS:

div.lines { 
    white-space: pre-line; 
} 
+0

no, no funciona ... pero lo investigaré más. ¡Gracias! – ew89

+4

@ ew89: por supuesto que funciona. Estás tratando de resolver el problema equivocado. – Tomalak

+2

Esta es la verdadera respuesta. Si todo está funcionando bien, una nueva línea simple debería hacerlo. Algunos analizadores tienen una bandera para ignorar selectivamente el espacio en blanco, por lo que puedes usarlo para sangrar tu archivo XML, pero dudo que ese sea tu problema. (que es, en mi humilde opinión, un abuso del formato.) El espacio en blanco en XML es * significativo *, incluidas las pestañas/espacios que utiliza para la sangría. – Thanatos

3

En el XML: utilice saltos de línea literales, n otra cosa más necesaria allí.

Las líneas nuevas se conservarán para que Javascript las lea [1]. Tenga en cuenta que los espacios de sangría y los saltos de línea anteriores o posteriores también se conservan (la razón por la que no los estaba viendo es que HTML/CSS colapsa espacios en blanco en caracteres de espacio único de forma predeterminada).

A continuación, la forma más fácil es: en el HTML: no hacer nada, sólo tiene que utilizar CSS para conservar los saltos de línea

.msg_body { 
    white-space: pre-line; 
} 

Pero esto también conserva sus líneas adicionales a partir del documento XML, y no funciona en IE 6 o 7 [2].

Así que limpie el espacio en blanco usted mismo; esta es una manera de hacerlo (saltos de línea para mayor claridad - Javascript está feliz con o sin ellos [3]) [4]

[get lyric...].nodeValue 
    .replace(/^[\r\n\t ]+|[\r\n\t ]+$/g, '') 
    .replace(/[ \t]+/g, ' ') 
    .replace(/ ?([\r\n]) ?/g, '$1') 

y preservar esos saltos de línea con

.msg_body { 
    white-space: pre; // for IE 6 and 7 
    white-space: pre-wrap; // or pre-line 
} 

o, en lugar de ese CSS, agregue un .replace(/\r?\n/g, '<br />') después del otro JavaScript .replace s.

(Nota al margen: el uso de document.write() de esa manera tampoco es ideal y algunas veces es vulnerable a los ataques de scripts entre sitios, pero ese es otro tema. En relación con esta respuesta, si quería usar la variación que reemplaza con <br>, que tendría que escapar <, & (, >, ", ') antes de la generación de los <br> s)

-

[1] referencia. secciones "Elemento Espacio en blanco de manipulación "y" Esquema XML Control de espacio en blanco " http://www.usingxml.com/Basics/XmlSpace#ElementWhiteSpaceHandling

[2] http://www.quirksmode.org/css/whitespace.html

[3] a excepción de unos pocos lugares en la sintaxis de Javascript donde su inserción punto y coma es particularmente molesto.

[4] Lo escribí y probé estas expresiones regulares en Linux Node.js (que usa el mismo motor Javascript que Chrome, "V8"). Existe un pequeño riesgo de que el navegador ejecute regexps de manera diferente. (Mi cadena de prueba (en la sintaxis javascript) "\n\nfoo bar baz\n\n\tmore lyrics \nare good\n\n")

+0

espacio en blanco: línea anterior; - Funciona perfectamente –

2

simplemente use &lt;br&gt; al final de sus líneas.

1
<description><![CDATA[first line<br/>second line<br/>]]></description> 
+1

Esta sería una mejor respuesta si usted explica lo que significa. –

0

Si está usando CSS para el estilo (No se recomienda.) Puede utilizar display:block;, sin embargo, esto sólo le dará saltos de línea antes y después de el elemento de estilo.