2010-06-06 7 views
18

Je suis un débutant dans le développement web, et j'essaie d'insérer des sauts de ligne dans mon fichier XML. Ce est ce que mon XML ressemble à:Rupture de ligne 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> 

Je veux avoir des sauts de ligne entre les phrases pour les paroles. J'ai tout essayé de/n, et d'autres codes similaires, PHP analyse, etc., et rien ne fonctionne! J'ai été googling en ligne pendant des heures et n'arrive pas à trouver la réponse. J'utilise le XML pour insérer des données dans une page HTML en utilisant Javascript.

Est-ce que quelqu'un sait comment résoudre ce problème?

Et c'est le code JS I utilisé pour insérer les données XML à la page 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

Veuillez poster un code montrant comment vous utilisez le XML. –

+1

Pouvez-vous clarifier une chose? Avez-vous de la difficulté à créer le fichier XML (si vous l'ouvrez dans un éditeur de texte stupide, voyez-vous ce que vous attendez?) Ou avez-vous de la difficulté à rendre le texte dans le navigateur? Mon soupçon est que le problème est que les navigateurs rendent n'importe quel espace blanc (espaces, tabulations, sauts de ligne, etc.) comme un seul espace, donc le problème n'est pas le XML, c'est le texte. Vous devez ajouter '
' (notez la barre oblique) pour le rendre dans le navigateur ou vous devez l'écrire dans un bloc'

 '. –
                        
                            
    Andrew
                                
                            
                        
                    

+0

Le XML est à peu près ce que j'ai posté en haut de la page, et j'ai ajouté le code Javascript que j'ai utilisé pour insérer les données XML dans la page HTML (juste au cas où c'est nécessaire). – ew89

Répondre

24

@icktoofay était proche avec le CData

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

FONCTIONNE PARFAITEMENT !!!Merci beaucoup, exactement ce que je cherchais :) – ew89

+1

Depuis que vous utilisez CDATA, pourquoi avez-vous besoin des sauts de ligne réels? –

+0

Les sauts de ligne ne sont pas nécessaires ... Je les ai juste mis là pour montrer les pauses. Il peut facilement être réduit à une seule ligne. –

1

Si vous utilisez CDATA, vous pouvez intégrer la ligne se casse directement dans le fichier XML que je pense. Exemple:

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

Je l'ai essayé, mais ensuite le fichier XML ne se chargerait pas dans la page HTML (résultant en un espace vide où le XML est censé être chargé) :( – ew89

+1

Cela fonctionne parfaitement bien sans CDATA – Tomalak

7

A la fin de vos lignes, il suffit d'ajouter le caractère spécial suivant: &#xD;

Ce caractère spécial définit le caractère de retour chariot.

+0

J'ai aussi essayé , mais le code n'apparaît tout simplement pas dans la page HTML, à la fois comme un saut de ligne et comme un typage littéral, mais le reste des données XML se charge parfaitement – ew89

+3

@ ew89: Les sauts de ligne dans le code source ne provoquent pas de sauts de ligne Pour le HTML, vous voulez des balises '
' – Tomalak

+1

@Scorchin: Vous pouvez utiliser un simple saut de ligne littéral Il n'est pas nécessaire de l'encoder sauf dans les valeurs d'attribut – 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 à hauteur de Home on the Range)

Si c'était le mien, j'Envelopper les refrains aurait et vers dans les éléments XML ainsi.

+0

Pas une mauvaise idée, mais trop bavarde! CDATA fonctionne bien ici. – fastcodejava

+0

@fastcodejava: Vous êtes un gars de Java et vous me dites que c'est verbeux? :) Nah, pas assez verbeux! Comme je l'ai mentionné dans mon montage, j'envelopperais des refrains et des couplets. – Robusto

22

En XML, un saut de ligne est un caractère normal. Vous pouvez le faire:

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

et le contenu de <text> serez

 
some text 
with 
three lines 

Si cela ne fonctionne pas pour vous, vous faites quelque chose de mal. Des "solutions de contournement" spéciales telles que l'encodage du saut de ligne sont inutiles. D'autre part, des choses comme \n ne fonctionneront pas, car XML n'a pas de séquences d'échappement *.


* Notez que &#xA; est l'entité de caractères qui représente un saut de ligne dans sérialisé XML. "XML n'a pas de séquences d'échappement" signifie la situation lorsque vous interagissez avec un document DOM, en définissant des valeurs de nœud via l'API DOM.

C'est là ni &#xA;, ni des choses comme \n fonctionnera, mais un caractère réel de saut de ligne volonté. La façon dont ce personnage finit dans le document sérialisé (c'est-à-dire "fichier") dépend de l'API et ne devrait pas vous concerner. Puisque vous semblez vous demander où votre saut de ligne va en HTML: Jetez un oeil dans votre code source, ils sont là. HTML ignore les sauts de ligne dans le code source. Utilisez les balises <br> pour forcer les sauts de ligne à l'écran.

est ici une fonction JavaScript qui insère <br> dans une chaîne multi-ligne:

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

Sinon, vous pouvez forcer les sauts de ligne à caractères de nouvelle ligne avec CSS:

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

non, ne fonctionne pas .. mais je vais regarder dans plus. Merci! – ew89

+4

@ ew89: Bien sûr que cela fonctionne. Vous essayez simplement de résoudre le mauvais problème. – Tomalak

+2

C'est la vraie réponse. Si tout fonctionne bien, un simple saut de ligne devrait le faire. Certains analyseurs ont un drapeau pour ignorer sélectivement les espaces, de sorte que vous pouvez l'utiliser pour indenter votre fichier XML, mais je doute que c'est votre problème. (qui est, à mon humble avis, un abus du format.) Whitespace en XML est * significatif *, y compris les onglets/espaces que vous utilisez pour l'indentation. – Thanatos

3

Dans XML: utilisez des sauts de ligne littéraux, n Rien d'autre à faire là-bas.

Les nouvelles lignes seront conservées pour que Javascript les lise [1]. Notez que les espaces d'indentation et les sauts de ligne précédant ou suivant sont également conservés (la raison pour laquelle vous ne les avez pas vus est que HTML/CSS réduit les espaces en caractères uniques par défaut).

Alors le chemin est plus facile: dans le code HTML: ne rien faire, il suffit d'utiliser les CSS pour conserver les sauts de ligne

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

Mais cela préserve également vos lignes supplémentaires à partir du document XML, et ne fonctionne pas dans IE 6 ou 7 [2].

Alors nettoyez vous-même les espaces; c'est une façon de le faire (linebreaks pour plus de clarté - Javascript est heureux avec ou sans eux [3]) [4]

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

puis les conserver avec linebreaks

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

ou, au lieu de ce CSS, ajoutez un .replace(/\r?\n/g, '<br />') après l'autre JavaScript .replace s.

(Note de bas de page: Utiliser document.write() comme cela n'est pas non plus idéal et parfois vulnérable aux attaques de script inter-site, mais c'est un autre sujet En relation avec cette réponse, si vous voulez utiliser la variante qui remplace avec <br>, vous auriez à échapper <, & (, >, ", ') avant générer les <br> s)

-

[1] référence:. sections « Element White Space Handling "et" XML Schema White Space Control " http://www.usingxml.com/Basics/XmlSpace#ElementWhiteSpaceHandling

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

[3] à l'exception de quelques endroits dans la syntaxe Javascript où est particulièrement gênant son insertion virgule.

[4] Je l'ai écrit et testé ces expressions rationnelles dans Linux Node.js (qui utilise le même moteur Javascript que Chrome, "V8"). Il y a un petit risque que certains navigateurs exécutent des expressions rationnelles différemment. (Ma chaîne de test (en syntaxe javascript) "\n\nfoo bar baz\n\n\tmore lyrics \nare good\n\n")

+0

blanc-espace: pré-ligne; - fonctionne parfaitement –

2

utilisez simplement &lt;br&gt; à la fin de vos lignes.

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

Ce serait une meilleure réponse si vous avez expliqué ce que cela signifie. –

0

Si vous utilisez le style CSS pour (Non recommandé.), Vous pouvez utiliser display:block;, cependant, cela ne vous donnera des sauts de ligne avant et après l'élément de style.

Questions connexes