2010-06-06 3 views
18

Я новичок в веб-разработке, и я пытаюсь вставить разрывы строк в свой 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, и других кодов, похожих на него, разбора 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> 
+0

Просьба указать код, показывающий, как вы используете XML. –

+1

Можете ли вы прояснить одно? У вас возникли проблемы с созданием XML-файла (если вы его открываете в немой текстовом редакторе, вы видите, что вы ожидаете увидеть?), Или у вас возникли проблемы с отображением текста в браузере. Мое подозрение заключается в том, что проблема заключается в том, что браузеры отображают ЛЮБОЕ пустое пространство (пробелы, табуляции, разрывы строк и т. Д.) Как одно пространство, поэтому проблема не в XML, а в тексте. Вам нужно добавить '
' (обратите внимание на завершающую косую черту), чтобы он визуализировался в браузере, или вам нужно записать его в блок '

'. –
                        
                            
    Andrew
                                
                            
                        
                    

+0

XML - это в значительной степени то, что я разместил в верхней части страницы, и я добавил код Javascript, который я использовал для вставки XML-данных на страницу HTML (на всякий случай, если это необходимо). – ew89

ответ

24

@icktoofay был близок с CData

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

РАБОТАЕТ СОВЕРШЕННО !!!Большое вам спасибо, именно то, что я искал :) – ew89

+1

Поскольку вы используете CDATA, зачем вам нужны разрывы строк? –

+0

Разрывы строк не нужны ... Я просто положил их туда, чтобы показать перерывы. Его можно легко свести к одной строке. –

1

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

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

Я попробовал, но тогда XML-файл просто не загрузился бы на HTML-страницу (в результате получилось пустое пространство, где должен быть загружен XML) :( – ew89

+1

Это прекрасно работает без CDATA. – Tomalak

7

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

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

+0

Я тоже это пробовал , но код просто не отображается на странице HTML, как в виде разрыва строки, так и в виде буквенного ввода, но все остальные данные XML загружаются отлично. – ew89

+3

@ ew89: Разрывы строк в исходном коде не вызывают прерывания строк в визуализированный HTML. Для HTML вам нужны теги
. – Tomalak

+1

@Scorchin: вы можете использовать простой литеральный разрыв строки. Нет необходимости кодировать его, кроме значений атрибутов. – 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 на мотив дома на полигоне)

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

+0

Неплохая идея, но слишком многословная! CDATA отлично работает здесь. – fastcodejava

+0

@fastcodejava: Вы парень Java, и вы говорите мне, что это многословно? :) Нет, не достаточно многословие! Как я упоминал в своем редактировании, я бы обернул хоры и стихи. – Robusto

22

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

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

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

 
some text 
with 
three lines 

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


* Обратите внимание, что &#xA; является характер лицо, которое представляет разрыв строки в сериализованном XML. «XML не имеет escape-последовательностей» означает ситуацию, когда вы взаимодействуете с документом DOM, устанавливая значения узлов через 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; 
} 
+0

nope, не работает .. но я рассмотрю его больше. Благодаря! – ew89

+4

@ ew89: Конечно, это работает. Вы просто пытаетесь решить неправильную проблему. – Tomalak

+2

Это реальный ответ. Если все работает хорошо, простая новая строка должна это сделать. У некоторых парсеров есть флаг для выборочного игнорирования пробелов, поэтому вы можете использовать его для отступы в вашем XML-файле, но я сомневаюсь, что это ваша проблема. (то есть, IMHO, злоупотребление форматом). Пробелы в XML * значимые *, включая вкладки/пробелы, которые вы используете для отступов. – Thanatos

3

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

Новые строки будут сохранены для 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> с)

-

[1] ссылка:. разделы «Element White Space Handling »и« Управление пробелами в схеме 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")

+0

white-space: pre-line; - отлично работает –

2

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

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

Это был бы лучший ответ, если бы вы объяснили, что это значит. –

0

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