Подтвердить что ты не робот

Разрыв строки в XML?

Я начинающий в веб-разработке, и я пытаюсь вставить разрывы строк в свой XML файл. Вот как выглядит мой 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>

Я хочу иметь разрывы строк между предложениями для текста. Я пробовал все: от /n, & # xD; и другие аналогичные ему коды, парсинг PHP и т.д., и ничего не работает! Были онлайн в Интернете в течение нескольких часов и, похоже, не нашли ответа. Я использую XML для вставки данных на HTML-страницу с помощью Javascript.

Кто-нибудь знает, как решить эту проблему?

И это код JS, который я использовал для вставки XML-данных в 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>
4b9b3361

Ответ 1

@icktoofay был близок к CData​​p >

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

Ответ 2

В XML разрыв строки является нормальным символом. Вы можете сделать это:

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

а содержимое <text> будет

some text
with
three lines

Если это не сработает для вас, вы делаете что-то неправильно. Специальные "обходные пути", такие как кодирование разрыва строки, не нужны. С другой стороны, такие вещи, как \n, не будут работать, поскольку XML не имеет escape-последовательностей *.


* Обратите внимание, что &#xA; является символьной сущностью, которая представляет разрыв строки в сериализованном XML. "XML не имеет escape-последовательностей" означает ситуацию, когда вы взаимодействуете с документом DOM, устанавливая значения node через DOM API.

Здесь не будет ни &#xA;, ни такие вещи, как \n, но фактический символ новой строки будет. Как этот символ попадает в сериализованный документ (т.е. "Файл" ) соответствует API и не должен вас беспокоить.


Поскольку вы, кажется, задаетесь вопросом, где ваши перерывы в строке идут в HTML: посмотрите на свой исходный код, вот они. HTML игнорирует разрывы строк в исходном коде. Используйте теги <br>, чтобы заставить разрывы строк на экране.

Вот функция JavaScript, которая вставляет <br> в многострочную строку:

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

В качестве альтернативы вы можете форсировать разрывы строк на новых строковых символах с помощью CSS:

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

Ответ 3

В конце ваших строк просто добавьте следующий специальный символ: &#xD;

Этот специальный символ определяет символ возврата каретки.

Ответ 4

В XML: используйте литеральные разрывы строк, там ничего не нужно.

Новые строки будут сохранены для чтения Javascript [1]. Обратите внимание, что все промежутки отступа и предшествующие или завершающие разрывы строк также сохраняются (причина, по которой вы их не видели, заключается в том, что HTML/CSS по умолчанию сворачивает пробелы в одиночные пробелы).

Тогда самый простой способ: В HTML: ничего не делать, просто используйте CSS для сохранения разрывов строк

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

Но это также сохраняет ваши дополнительные строки из XML-документа и не работает в IE 6 или 7 [2].

Так очистите пробел самостоятельно; это один из способов сделать это (строки для ясности - Javascript доволен или без них [3]) [4]

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

а затем сохраните эти разрывы строк с помощью

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

или вместо этого CSS добавьте .replace(/\r?\n/g, '<br />') после другого JavaScript .replace s.

(Боковое примечание: Использование document.write() подобно этому также не является идеальным и иногда уязвимым для межсайтовых скриптовых атак, но это другой предмет. В отношении этого ответа, если вы хотите использовать вариацию, заменяющую <br>, вы должны выйти <, & (, >, ", ') перед созданием <br> s.)

-

[1] ссылка: разделы "Элемент управления белым пространством" и "Управление пробелами в схеме XML" http://www.usingxml.com/Basics/XmlSpace#ElementWhiteSpaceHandling

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

[3], за исключением нескольких мест в синтаксисе Javascript, где его точка с запятой особенно раздражает.

[4] Я написал его и протестировал эти регулярные выражения в Linux Node.js(который использует тот же механизм Javascript, что и Chrome, "V8" ). Там небольшой риск, что какой-либо браузер выполняет регулярные выражения по-разному. (Моя тестовая строка (в синтаксисе javascript) "\n\nfoo bar baz\n\n\tmore lyrics \nare good\n\n")

Ответ 5

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

(Воспроизведение мелодии "Домой" на диапазоне)

Если бы это было мое, я бы обернул хоры и стихи в элементах XML.

Ответ 6

просто используйте &lt;br&gt; в конце ваших строк.

Ответ 7

Если вы используете CDATA, вы можете встроить разрывы строк непосредственно в XML, я думаю. Пример:

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

Ответ 8

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

Ответ 9

Если вы используете стиль CSS (не рекомендуется), вы можете использовать display:block;, однако это даст вам только разрывы строк до и после стилизованного элемента.