2010-06-06 25 views
18

Sono un principiante nello sviluppo web e sto cercando di inserire interruzioni di riga nel mio file XML. Questo è ciò che la mia XML assomiglia:Interruzione di riga in 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> 

voglio avere interruzioni di linea tra le frasi i testi per. Ho provato di tutto da/n, e altri codici simili ad esso, l'analisi PHP, ecc., E niente funziona! Sono stato googling online per ore e non riesco a trovare la risposta. Sto usando l'XML per inserire dati in una pagina HTML usando Javascript.

Qualcuno sa come risolvere questo problema?

E questo è il codice JS che ho usato per inserire i dati XML alla pagina 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

Inserisci un codice che mostri come stai utilizzando l'XML. –

+1

Puoi chiarire una cosa? Stai riscontrando problemi nel creare il file XML (se lo apri in un editor di testi stupido, vedi cosa ti aspetti di vedere?) O stai riscontrando problemi nel rendering del testo nel browser. Il mio sospetto è che il problema è che i browser rendono QUALSIASI spazio bianco (spazi, tabulazioni, interruzioni di riga, ecc.) Come un unico spazio, quindi il problema non è l'XML, è il testo. Devi aggiungere '
' (nota la barra finale) per renderlo visualizzato nel browser o devi scriverlo su un blocco '

'. –
                        
                            
    Andrew
                                
                            
                        
                    

+0

L'XML è praticamente ciò che ho postato nella parte superiore della pagina e ho aggiunto il codice Javascript che ho usato per inserire i dati XML nella pagina HTML (nel caso sia necessario). – ew89

risposta

24

@icktoofay era vicino con il CData

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

FUNZIONA PERFETTAMENTE !!!Grazie mille, esattamente quello che stavo cercando :) – ew89

+1

Dato che stai usando CDATA, perché hai bisogno delle interruzioni di riga effettive? –

+0

Le interruzioni di riga non sono necessarie ... Le ho appena messe lì per mostrare le interruzioni. Può essere facilmente ridotto a una sola riga. –

1

Se si utilizza CDATA, si potrebbe incorporare il interruzioni di riga direttamente nella XML credo. Esempio:

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

L'ho provato, ma il file XML non si caricava nella pagina HTML (risultando in uno spazio vuoto in cui si suppone che venga caricato XML) :( – ew89

+1

Funziona perfettamente senza CDATA. – Tomalak

7

Alla fine delle linee, è sufficiente aggiungere il seguente carattere speciale: &#xD;

Questo carattere speciale definisce il carattere di ritorno a capo.

+0

Ho provato anche quello ma il codice semplicemente non viene visualizzato nella pagina HTML, sia come interruzione di riga che come tipo letterale, ma il resto dei dati XML viene caricato perfettamente. – ew89

+3

@ ew89: interruzioni di riga nel codice sorgente non causano interruzioni di riga HTML per HTML si desidera tag '
' – Tomalak

+1

@Scorchin: è possibile utilizzare un semplice interruzione di riga letterale.Non è necessario codificarlo tranne nei valori di attributo – 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 per la somma di Mucche alla riscossa)

Se fosse mia mi piacerebbe avvolgere i cori e versi in elementi XML pure.

+0

Non una cattiva idea, ma troppo prolisso! CDATA funziona bene qui. – fastcodejava

+0

@fastcodejava: sei un ragazzo Java e mi dici che è prolisso? :) Nah, non abbastanza verboso! Come ho accennato nella mia modifica, vorrei anche avvolgere cori e versi. – Robusto

22

In XML un'interruzione di riga è un carattere normale. È possibile farlo:

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

e il contenuto di <text> sarà

 
some text 
with 
three lines 

Se questo non funziona per voi, si sta facendo qualcosa di sbagliato. Speciali "soluzioni alternative" come codificare l'interruzione di riga non sono necessarie. Cose come \n non funzioneranno, d'altra parte, perché XML non ha sequenze di escape *.


* Nota che &#xA; è l'entità di carattere che rappresenta un'interruzione di linea in serializzato XML. "XML non ha sequenze di escape" indica la situazione quando interagisci con un documento DOM, impostando i valori del nodo tramite l'API DOM.

Questo è dove funzionerà né &#xA; né cose come \n, ma un vero e proprio carattere di nuova riga faranno. Il modo in cui questo personaggio finisce nel documento serializzato (ad esempio "file") dipende dall'API e non dovrebbe interessarti.

Dal momento che sembra chiedersi dove vanno le interruzioni di riga in HTML: dare un'occhiata al codice sorgente, eccole. HTML ignora le interruzioni di riga nel codice sorgente. Utilizzare i tag <br> per forzare le interruzioni di riga sullo schermo.

Ecco una funzione JavaScript che inserisce <br> in una stringa a più linee:

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

In alternativa è possibile forzare interruzioni di riga in caratteri di nuova riga con i CSS:

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

no, non funziona..ma lo esaminerò di più. Grazie! – ew89

+4

@ ew89: Certo che funziona. Stai solo cercando di risolvere il problema sbagliato. – Tomalak

+2

Questa è la vera risposta. Se tutto funziona bene, una semplice newline dovrebbe farlo. Alcuni parser hanno un flag per ignorare selettivamente gli spazi, in modo che tu possa usarli per indentare il tuo file XML, ma dubito che questo sia il tuo problema. (che è, IMHO, un abuso del formato.) Lo spazio bianco in XML è * significativo *, comprese le schede/gli spazi che usi per il rientro. – Thanatos

3

Nell'XML: utilizzare interruzioni di riga letterali, n nessun altro ha avuto bisogno di lì.

Le nuove righe saranno conservate affinché Javascript possa leggerle [1]. Nota che anche gli spazi di indentazione e le interruzioni di riga precedenti o finali sono conservati (il motivo per cui non li vedi è che HTML/CSS collassa gli spazi bianchi in spazi-caratteri singoli per impostazione predefinita).

Quindi il modo più semplice è: in HTML: non fare nulla, basta usare i CSS per preservare le line-breaks

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

Ma questa conserva anche le linee aggiuntive dal documento XML, e non funziona in IE 6 o 7 [2].

Quindi ripulisci lo spazio bianco da solo; questo è un modo per farlo (linebreaks per chiarezza - Javascript è felice con o senza di loro [3]) [4]

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

e quindi preservare quelle interruzioni di linea con

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

o, invece di quello CSS, aggiungi uno .replace(/\r?\n/g, '<br />') dopo l'altro JavaScript .replace s.

(Nota a margine: Utilizzo document.write(), come che è anche l'ideale e talvolta vulnerabili ad attacchi di cross-site scripting, ma questo è un altro soggetto in relazione a questa risposta, se si voleva utilizzare la variante che sostituisce. con <br>, dovreste sfuggire <, & (, >, ", ') prima generare le <br> s)

-

[1] di riferimento:. sezioni "Element White Space Handling "e" XML Schema White Space Control " http://www.usingxml.com/Basics/XmlSpace#ElementWhiteSpaceHandling

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

[3] ad eccezione di alcuni posti nella sintassi di JavaScript in cui il suo inserimento e virgola è particolarmente fastidioso.

[4] L'ho scritto e testato queste espressioni regolari in Linux Node.js (che utilizza lo stesso motore Javascript di Chrome, "V8"). C'è un piccolo rischio che alcuni browser eseguano espressioni regolari in modo diverso. (La mia stringa di prova (in javascript sintassi) "\n\nfoo bar baz\n\n\tmore lyrics \nare good\n\n")

+0

white-space: pre-line; - funziona perfettamente –

2

basta usare &lt;br&gt; alla fine delle righe.

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

Questa sarebbe una risposta migliore se hai spiegato cosa significa. –

0

Se si utilizza i CSS per lo stile (non consigliato.) È possibile utilizzare display:block;, tuttavia, questo solo vi darà interruzioni di riga prima e dopo l'elemento di stile.

Problemi correlati