web-dev-qa-db-fra.com

Line Break en XML?

Je suis un débutant en développement Web et j'essaie d'insérer des sauts de ligne dans mon fichier XML . Voici à quoi ressemble mon 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, & # xD; et d’autres codes similaires, l’analyse PHP, etc., et rien ne fonctionne! Je suis sur Google depuis des heures et je n'arrive pas à trouver la réponse. J'utilise le XML pour insérer des données dans une page HTML à l'aide de Javascript.

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

Et voici le code JS que j'ai utilisé pour insérer les données XML dans 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>
18
ew89

@icktoofay était proche du CData

<myxml>
    <record>
        <![CDATA[
        Line 1 <br />
        Line 2 <br />
        Line 3 <br />
        ]]>
    </record>
</myxml>
25
Chase Florell

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

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

et le contenu de <text> sera

 du texte 
 avec 
 trois lignes 

Si cela ne fonctionne pas pour vous, vous faites quelque chose de mal. Des "solutions de contournement" spéciales telles que le codage du saut de ligne ne sont pas nécessaires. Des choses comme \n ne fonctionneront pas, parce que XML n'a pas de séquence d'échappement*.


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

Ceci est où ni &#xA; ni des choses comme \n ne fonctionneront, mais un caractère actuel nouvelle ligne. La façon dont ce caractère se retrouve 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ù vont vos sauts de ligne en HTML: Regardez 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. 

Voici une fonction JavaScript qui insère <br> dans une chaîne multiligne:

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

Vous pouvez également forcer les sauts de ligne dans les caractères de nouvelle ligne avec CSS:

div.lines {
    white-space: pre-line;
}
22
Tomalak

À la fin de vos lignes, ajoutez simplement le caractère spécial suivant: &#xD;

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

7
KushalP

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

3
Abolfazl Beigi

Dans le XML: utilisez des sauts de ligne littéraux, rien d’autre n’est nécessaire.

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

Ensuite, le moyen le plus simple est: Dans le HTML: ne faites rien, utilisez simplement CSS pour conserver les sauts de ligne.

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

Mais cela préserve également vos lignes supplémentaires 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 (sauts de ligne pour plus de clarté - Javascript est content 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 conservez ces sauts de ligne avec

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

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

(Note latérale: Utiliser document.write () comme cela n’est pas non plus idéal et est parfois vulnérable aux attaques de script entre sites, mais c’est un autre sujet. Pour cette réponse, si vous voulez utiliser la variante qui remplace par <br>, 'devra échapper à <, & (, >, ", ') avant générant le <br>s.)

-

[1] Référence: sections "Traitement de l'espace et des espaces" et "Contrôle de l'espace du schéma XML" http://www.usingxml.com/Basics/XmlSpace#ElementWhiteSpaceHandling

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

[3] À quelques exceptions près dans la syntaxe Javascript où son insertion en point-virgule est particulièrement gênante.

[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 existe un faible risque que certains navigateurs exécutent les expressions rationnelles différemment. (Ma chaîne de test (en syntaxe javascript) "\n\nfoo bar baz\n\n\tmore lyrics \nare good\n\n")

3
idupree
<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>

(Chanté sur l'air de Home on the Range )

Si c’était à moi, j’envelopperais aussi les refrains et les couplets dans des éléments XML.

2
Robusto

Si vous utilisez CDATA, vous pouvez intégrer les sauts de ligne directement dans le XML, je pense. Exemple:

<song>
    <title>Song Title</title>
    <lyric><![CDATA[Line 1
Line 2
Line 3]]></lyric>
</song>
1
icktoofay
<description><![CDATA[first line<br/>second line<br/>]]></description>
1
sohaib

Si vous utilisez CSS pour styler (non recommandé.), Vous pouvez utiliser display:block;; toutefois, cela ne vous donnera que des sauts de ligne avant et après l'élément stylisé. 

0
Ben