XML中的换行符?

20

我是一个网络开发的初学者,我试图在我的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 通过 Javascript 插入数据到 HTML 页面中。

有人知道如何解决这个问题吗?

以下是我用来将 XML 数据插入到 HTML 页面的 JS 代码:

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

请发布一些代码,展示您如何使用XML。 - John Saunders
1
您能澄清一件事吗?您是否在构建XML文件时遇到问题(如果您在愚笨的文本编辑器中打开它,能否看到您期望看到的内容?)还是您无法在浏览器中呈现文本。我怀疑问题在于浏览器将任何空白字符(空格、制表符、换行符等)呈现为单个空格,因此问题不在于XML,而在于文本。您需要添加<br />(注意尾随斜杠)以便在浏览器中呈现它,或者您需要将它写入<pre></pre>块中。 - Andrew
1
@ew89:你发布的XML似乎在<lyric>标签内没有任何换行符...你期望什么? - Thanatos
2
@ew98:但是通过简化它,您已经删除了如何将换行符插入XML的方式,将其转换为普通的XML片段。您插入的换行符对于解决问题至关重要-如果我们能够查看您正在执行的操作,以便验证其是否正确或不正确,那将非常有用。否则,它只是XML,我知道XML长什么样子。 - Thanatos
好的,我会记住这个以备将来参考。 - ew89
显示剩余3条评论
9个回答

28

@icktoofay接近了CData

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

1
既然您正在使用CDATA,为什么还需要实际的换行符呢? - John Saunders
换行符不是必需的,这么写只是为了显示分行。它很容易被缩减成一行。 - Chase Florell

24
在XML中,换行符是一个普通的字符。你可以这样做:
<xml>
  <text>some text
with
three lines</text>
</xml>

并且<text>的内容将会是

一些文本
有
三行

如果这对您没有起作用,那么您可能做错了什么。不必采取特殊的“变通方法”来编码换行符。另一方面,像\n这样的东西不起作用,因为XML没有转义序列*


*请注意,&#xA;是在序列化的 XML 中表示换行符的字符实体。"XML没有转义序列"指的是当您通过DOM API设置节点值时与DOM文档交互的情况。

这是&#xA;或像\n这样的东西都不起作用的地方,但是一个真实的换行符将会有效。这个字符如何出现在序列化的文档(即“文件”)中取决于API,并且不应该让您担心。


由于您似乎想知道HTML中的换行符去哪里了:请查看源代码,它们就在那里。HTML忽略源代码中的换行符。使用<br>标签可以强制进行屏幕上的换行。

这是一个插入<br>到多行字符串中的JavaScript函数:

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

你也可以使用CSS来在换行符处强制换行:

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

不行,不起作用...但我会更深入地研究它。谢谢! - ew89
4
当然可以,你只是试图解决错误的问题。 - Tomalak
2
这才是真正的答案。如果一切正常,一个简单的换行符就可以了。有些解析器有一个标志来选择性地忽略空格,这样你就可以用它来缩进你的XML文件,但我怀疑这不是你的问题。(在我看来,这是对格式的滥用。)XML中的空白是有意义的,包括你用于缩进的制表符/空格。 - Thanatos

8
只需在行末使用&lt;br&gt;即可。

1
这是唯一一个对我有用的答案。谢谢。 - Ronnie Oosting
1
这个有效....! - vishnu

7

在你的文本末尾,只需添加以下特殊字符:&#xD;

该特殊字符定义了回车符。


3
源代码中的换行不会在渲染后的 HTML 中产生换行。如果要在 HTML 中实现换行,需要使用 <br> 标签。 - Tomalak
1
@Scorchin:你可以使用简单的文字换行。除了属性值之外,没有必要对其进行编码。 - Tomalak
有没有办法使XML文件或源代码中的换行在HTML页面中呈现?这是因为我正在为客户进行此操作,而她没有任何HTML知识。 - ew89
我尝试使用字面换行,但所有内容最终都显示在一行中。 - ew89
@ew89:请阅读您收到的评论。 - Tomalak
显示剩余2条评论

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,可以在其他JavaScript的.replace之后添加一个.replace(/\r?\n/g, '<br />')
(顺便说一句:像那样使用document.write()也不理想,有时会容易受到跨站脚本攻击的影响,但这是另一个话题。关于这个答案,如果您想使用替换为<br>的变量,您必须在生成
之前转义<&>"'。)

--

[1] 参考: "元素空格处理"和"XML Schema空格控制"章节 http://www.usingxml.com/Basics/XmlSpace#ElementWhiteSpaceHandling

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

[3] 除了Javascript语法中的一些分号插入特别让人烦恼的地方。

[4] 我在Linux Node.js中编写并测试了这些正则表达式(它使用与Chrome相同的Javascript引擎“V8”)。存在一些浏览器可能会以不同的方式执行正则表达式的小风险。(我的测试字符串(以javascript语法)“\n\nfoo bar baz\n\n\tmore lyrics \nare good\n\n”


white-space: pre-line;
  • 运行非常完美
- Jeba Prince

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>

(按照《家在草原》的曲调唱)

如果这是我的话,我也会将副歌和诗句包裹在XML元素中。


不是一个坏主意,但太啰嗦了!在这里使用 CDATA 就可以了。 - fastcodejava
@fastcodejava:你是个Java专家,而且告诉我这太啰嗦了? :) 不,还远远不够啰嗦!就像我在编辑中提到的那样,我会将合唱和诗歌也包装起来。 - Robusto

1
如果您使用CDATA,我认为您可以直接将换行符嵌入XML中。例如:
<song>
    <title>Song Title</title>
    <lyric><![CDATA[Line 1Line 2Line 3]]></lyric>
</song>

我尝试了,但是XML文件就是无法加载到HTML页面中(导致XML应该加载的地方出现了空白):( - ew89
1
这个可以完美地运行,不需要使用CDATA。 - Tomalak

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

1
如果您解释一下它的含义,那么这将是一个更好的答案。 - Robert Harvey

0

如果您正在使用CSS进行样式设置(不推荐使用),则可以使用display:block;,但这只会在样式化元素之前之后提供换行符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接