2010-06-06 17 views
18

Ich bin ein Anfänger in der Webentwicklung, und ich versuche, Zeilenumbrüche in meine XML-Datei einzufügen. Dies ist, was meine XML wie folgt aussieht:Zeilenumbruch 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> 

I Linie für die Texte zwischen den Sätzen bricht in haben wollen. Ich habe alles aus/n, und andere ähnliche Codes, PHP-Parsing usw. versucht, und nichts funktioniert! Habe stundenlang online gegoogelt und finde nicht die Antwort. Ich verwende XML, um Daten mithilfe von Javascript in eine HTML-Seite einzufügen.

Weiß jemand, wie man dieses Problem löst?

Und das ist der JS-Code I verwendet, um die XML-Daten in der HTML-Seite einzufügen:

<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

Bitte poste einen Code, der zeigt, wie du das XML verwendest. –

+1

Können Sie eine Sache klären? Haben Sie Probleme beim Erstellen der XML-Datei (wenn Sie sie in einem dummen Texteditor öffnen, sehen Sie, was Sie erwarten?) Oder haben Sie Probleme, den Text im Browser zu rendern. Mein Verdacht ist, dass das Problem darin besteht, dass Browser JEDEN Leerraum (Leerzeichen, Tabulatoren, Zeilenumbrüche usw.) als einen einzigen Platz darstellen, also ist das Problem nicht das XML, sondern der Text. Sie müssen '
' (beachten Sie den abschließenden Schrägstrich) hinzufügen, damit es im Browser gerendert wird, oder Sie müssen es in einen '

' Block schreiben. –
                        
                            
    Andrew
                                
                            
                        
                    

+0

Das XML ist ziemlich genau das, was ich oben auf der Seite gepostet habe, und ich habe den Javascript-Code hinzugefügt, mit dem ich die XML-Daten in die HTML-Seite eingefügt habe (nur für den Fall, dass es benötigt wird). – ew89

Antwort

24

@icktoofay war in der Nähe mit dem CData

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

FUNKTIONIERT PERFEKT !!!Vielen Dank, genau das, was ich gesucht habe :) – ew89

+1

Da Sie CDATA verwenden, warum brauchen Sie die tatsächlichen Zeilenumbrüche? –

+0

Zeilenumbrüche sind nicht nötig ... Ich lege sie einfach hin, um die Pausen zu zeigen. Es kann leicht auf eine einzige Linie reduziert werden. –

1

Wenn Sie CDATA verwenden, können Sie einbetten die Linie direkt in die XML bricht, denke ich. Beispiel:

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

Ich habe es versucht, aber dann die XML-Datei würde einfach nicht in die HTML-Seite laden (was zu einem leeren Raum, wo die XML soll geladen werden) :( – ew89

+1

Dies funktioniert perfekt ohne CDATA. – Tomalak

7

Am Ende Ihrer Linien, fügen Sie einfach die folgenden Sonderzeichen: &#xD;

Das Sonderzeichen definiert das Wagenrücklaufzeichen.

+0

Ich habe das auch versucht , aber der Code erscheint einfach nicht in der HTML-Seite, sowohl als Zeilenumbruch als auch als literale Eingabe, aber der Rest der XML-Daten wird perfekt geladen. – ew89

+3

@ ew89: Zeilenumbrüche im Quellcode verursachen keine Zeilenumbrüche in gerenderten HTML. Für HTML möchten Sie '
' -Tags. – Tomalak

+1

@Scorchin: Sie könnten einen einfachen literalen Zeilenumbruch verwenden. Es ist nicht notwendig, es außer in Attributwerten zu codieren. – 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 in Höhe von Haus auf der Strecke)

Wenn es mir war ich auch die Chöre und Verse in XML-Elemente wickeln würde.

+0

Keine schlechte Idee, aber zu ausführlich! CDATA funktioniert hier gut. – fastcodejava

+0

@fastcodejava: Du bist ein Java-Typ und du sagst mir, das ist wortreich? :) Nein, nicht annähernd ausführlich genug! Wie ich in meinem Schnitt erwähnte, würde ich auch Chöre und Verse einpacken. – Robusto

22

In XML ist ein Zeilenumbruch ein normales Zeichen. Sie können dies tun:

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

und der Inhalt von <text> wird

 
some text 
with 
three lines 

werden, wenn dies bei Ihnen nicht funktioniert, müssen Sie etwas falsch machen. Spezielle "Workarounds" wie die Codierung des Zeilenumbrüchens sind nicht notwendig. Sachen wie \n funktionieren nicht, auf der anderen Seite, weil XML keine Escape-Sequenzen * hat.


* Beachten Sie, dass &#xA; die Zeichen Einheit, die einen Zeilenumbruch in serialisierten XML darstellt. "XML hat keine Escape-Sequenzen" bedeutet die Situation, wenn Sie mit einem DOM-Dokument interagieren und Knotenwerte über die DOM-API festlegen. Diese

ist, wo weder &#xA; noch Dinge wie \n funktionieren wird, aber ein tatsächliche Newline-Zeichen wird. Wie dieses Zeichen in dem serialisierten Dokument endet (d. H. "Datei"), hängt von der API ab und sollte Sie nicht betreffen.

Da Sie sich wundern, wo Ihre Zeilenumbrüche in HTML gehen: Werfen Sie einen Blick in Ihren Quellcode, da sind sie. HTML ignoriert Zeilenumbrüche im Quellcode. Verwenden Sie <br> Tags, um Zeilenumbrüche auf dem Bildschirm zu erzwingen.

Hier ist eine JavaScript-Funktion, die <br> in einen mehrzeiligen String fügt:

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

Alternativ können Sie Zeilenumbrüche in neuen Zeilen Zeichen mit CSS erzwingen:

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

nein, funktioniert nicht..aber ich werde mehr darüber schauen. Vielen Dank! – ew89

+4

@ ew89: Natürlich funktioniert es. Sie versuchen nur, das falsche Problem zu lösen. – Tomalak

+2

Dies ist die echte Antwort. Wenn alles gut läuft, sollte ein einfacher Zeilenumbruch es tun. Einige Parser haben ein Flag, um Whitespaces selektiv zu ignorieren, so dass Sie damit Ihre XML-Datei einrücken können, aber ich bezweifle, dass dies Ihr Problem ist. (Das ist IMHO, ein Missbrauch des Formats.) Whitespace in XML ist * signifikant *, einschließlich der Tabs/Leerzeichen, die Sie für das Einrücken verwenden. – Thanatos

3

In der XML: verwenden Sie literale Zeilenumbrüche, n nichts anderes war dort nötig.

Die Zeilenumbrüche werden für Javascript beibehalten, um sie zu lesen [1]. Beachten Sie, dass alle Einrückungs-Leerzeichen und vorangehende oder nachfolgende Zeilenumbrüche beibehalten werden (der Grund dafür, dass Sie sie nicht sehen, ist, dass HTML/CSS Whitespace standardmäßig in einzelne Leerzeichen zerlegt).

Dann ist der einfachste Weg: Im HTML: nichts tun, nur CSS verwenden, um die Zeilenumbrüche

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

Aber auch bewahrt Ihre persönlichen Zeilen aus dem XML-Dokument zu erhalten, und funktioniert nicht in IE 6 oder 7 [2].

Reinigen Sie also den Leerraum selbst; dies ist eine Möglichkeit, es zu tun (Zeilenumbrüche für Klarheit - Javascript ist glücklich mit oder ohne sie [3]) [4]

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

und dann die Zeilenumbrüche mit

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

oder zu erhalten, anstelle dieses CSS, fügen Sie eine .replace(/\r?\n/g, '<br />') nach dem anderen JavaScript .replace s.

(Randnotiz: Die Verwendung von document.write() ist auch nicht ideal und manchmal anfällig für Cross-Site-Scripting-Attacken, aber das ist ein anderes Thema. In Bezug auf diese Antwort, wenn Sie die Variante verwenden wollten, die ersetzt mit <br>, würden Sie < entkommen müssen, & (, >, ", ') vor die <br> s zu erzeugen)

-

[1]. Referenz: Abschnitte „Element White Space Handhabung "und" XML Schema White Space Control " http://www.usingxml.com/Basics/XmlSpace#ElementWhiteSpaceHandling

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

[3] bis auf wenige Orte in Javascript Syntax, wo seine Semikolon Einfügung besonders ärgerlich ist.

[4] Ich schrieb es und testete diese Regexps in Linux Node.js (die die gleiche Javascript-Engine wie Chrome verwendet, "V8"). Es gibt ein geringes Risiko, dass ein Browser andere Regexps ausführt. (Meine Testzeichenfolge (in Javascript-Syntax) "\n\nfoo bar baz\n\n\tmore lyrics \nare good\n\n")

+0

Leerraum: Vor-Zeile; - funktioniert perfekt –

2

verwenden Sie einfach &lt;br&gt; am Ende Ihrer Zeilen.

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

Das wäre eine bessere Antwort, wenn Sie erklären, was es bedeutet. –

0

Wenn Sie CSS-Stil verwenden (nicht empfohlen.) Können Sie display:block; verwenden, aber dies wird Ihnen nur Zeilenumbrüche vor und nach der Stil-Element.