对XML文档中的换行符敏感是“不好的做法”吗?

时间:2008-08-10 18:20:38

标签: xml xslt xhtml whitespace line-breaks

我正在生成一些XML文档,当涉及到地址部分时,我的片段看起来像这样:

<Address>15 Sample St
Example Bay
Some Country</Address>

我将其转换为XHTML的XSLT有一些时髦的递归模板,可以将字符串中的换行符转换为&lt; br /&gt;标签

这一切都很好;但依赖XML文档中的换行符会被视为“不良做法”吗?如果是这样,建议我这样做吗?

<Address><Line>15 Sample St</Line>
<Line>Example Bay</Line>
<Line>Some Country</Line></Address>

似乎把我的文字可能包含多行的每个地方包裹起来真的很尴尬......

12 个答案:

答案 0 :(得分:9)

通常认为依赖换行符是不好的做法,因为这是区分数据的一种脆弱方式。虽然大多数XML处理器将保留您放入XML中的任何空白,但并不能保证。

真正的问题是,大多数将XML输出为可读格式的应用程序都认为XML中的所有空格都是可互换的,并且可能会将这些换行符折叠到一个空格中。这就是为什么你的XSLT必须跳过这样的箍来正确渲染数据的原因。使用“br”标签可以大大简化转换。

另一个潜在的问题是,如果您在XML编辑器中打开XML文档并对其进行漂亮打印,则可能会丢失这些换行符。

如果您继续使用换行符,请确保将“xml:space =”preserve“属性添加到”地址“。 (如果您使用DTD,可以在DTD中执行此操作。)

有人建议阅读

  

XML应用程序似乎经常需要   对空白的骑士态度   因为关于地方的规则   一个XML文档,其中包含空格   没关系有时给这些   应用程序自由添加或   删除某些地方的空格。

答案 1 :(得分:3)

很少有人说CDATA块会让你保留换行符。这是错的。 CDATA部分只会将标记作为字符数据处理,它们将更改换行处理。

<Address>15 Sample St
Example Bay
Some Country</Address>

完全相同
<Address><![CDATA[15 Sample St
Example Bay
Some Country]]></Address>

唯一的区别是不同的API如何报告这一点。

答案 2 :(得分:2)

我认为唯一真正的问题是它使XML更难阅读。 e.g。

<Something>
    <Contains>
        <An>
            <Address>15 Sample St
Example Bay
Some Country</Address>
        </An>
    </Contains>
</Something>

如果不考虑漂亮的XML,我可能不会担心它,只要它有效。如果需要考虑漂亮的XML,我会在将显式换行符嵌入XML之前将其转换为<br />标记或\n

答案 3 :(得分:2)

如何使用属性来存储数据,而不是文本节点:

<Address Street="15 Sample St" City="Example Bay" State="" Country="Some Country"/>

我知道属性与文本节点的使用是一个经常被争论的主题,但我在95%的时间里都坚持使用属性,因此没有任何麻烦。

答案 4 :(得分:1)

这取决于您如何阅读和编写XML。

如果自动生成XML - 如果将换行符或显式 \ n 标记解析为
- 则无需担心。您的输入可能没有任何其他XML,因此根本不要乱用XML。

如果你手动使用标签,如果你问我,那么换行也更简洁。

例外情况是,如果您使用DOM从XML中获取某些结构。在这种情况下,换行显然是邪恶的,因为它们不能正确地代表层次结构。听起来,heirarchy与你的应用程序无关,所以断行听起来就足够了。

如果XML看起来很糟糕(特别是在自动生成时),Tidy可以提供帮助,尽管它可以更好地使用HTML而不是使用XML。

答案 5 :(得分:1)

这可能是一个有点欺骗性的例子,因为在这种情况下地址有点非规范化。这是一个合理的权衡,但因为地址字段很难规范化。 如果您使换行符包含重要信息,那么您将进行非规范化并使邮局解释换行符的含义。

我想说通常这不是一个大问题,但在这种情况下我认为Line标签是最正确的,因为它明确表明你实际上并没有解释不同文化中线条的含义。 (请记住,大多数输入地址的表格都有邮政编码等,地址第1行和第2行。)

让行标记的尴尬带有普通的XML,并且在编码恐怖时引起了很多争议。 http://www.codinghorror.com/blog/archives/001139.html

答案 6 :(得分:1)

关于whitespacelinefeeds and carriage returns in particular,XML规范有话要说。因此,如果您将自己限制为真正的换行符(x0A),那么您应该没问题。但是,许多编辑工具将重新格式化XML以“更好地呈现”,并可能摆脱特殊语法。比“&lt; line&gt;&lt; / line&gt;”更健壮,更清晰的方法想法是简单地使用命名空间并嵌入XHTML内容,例如:

<Address xmlns="http://www.w3.org/1999/xhtml">15 Sample St<br />Example Bay<br />Some Country</Address>

标准词汇表无需重新发明轮子。

答案 7 :(得分:0)

我看不出<Line>标签有什么问题 显然,数据的可视化对您来说非常重要,足以将其保存在您的数据中(通过第一个示例中的换行符)。精细。然后真的保持它,不要依靠“魔法”为你保留它。保留稍后您需要的所有数据,并且不能从保存的数据部分中完美推断出数据,即使它是可视化数据(换行符和其他格式)也要保留。您的用户(另一位开发人员的最终用户)花时间根据自己的喜好格式化数据 - 或者告诉他(输入附近的API文档/文本)您不打算保留它,或者 - 保留它。

答案 8 :(得分:-1)

是的,我认为使用CDATA块可以保护空白。虽然一些解析器API允许您保留空格。

答案 9 :(得分:-1)

您真正应该做的是将XML转换为保留空白区域的格式。

因此,而不是寻求用&lt; br /&gt;替换\ n你应该将整个块包装在&lt; pre&gt;

这样,您的地址在功能上保留(无论是否包含换行符),XSTL可以选择是否在结果中保留空格。

答案 10 :(得分:-1)

我建议您添加<br/>换行符或使用换行符实体 - &#x000D;

答案 11 :(得分:-2)

如果您需要保留换行符,请使用CDATA块,tweakt said

否则要小心。大多数情况下,XML软件会保留换行符,但有时它们不会,并且你真的不想依赖只能巧合的东西