8

我正在生成一些 XML 文档,当涉及到地址部分时,我的片段如下所示:

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

我用于将其转换为 XHTML 的 XSLT 有一些时髦的递归模板,可以将字符串中的换行符转换为 <br/> 标签。

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

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

似乎用这样的标签包裹我的文本可能是多行的每个地方真的很尴尬..

4

12 回答 12

9

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

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

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

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

一些建议阅读

XML 应用程序似乎常常对空白采取一种漫不经心的态度,因为关于 XML 文档中空白无关紧要的位置的规则有时使这些应用程序可以自由地在某些位置添加或删除空白。

于 2008-08-10T19:05:08.930 回答
3

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

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

我知道属性与文本节点的使用是一个经常争论的话题,但我 95% 的时间都坚持使用属性,并且没有因此而遇到任何麻烦。

于 2008-08-10T21:24:24.200 回答
3

很少有人说 CDATA 块将允许您保留换行符。这是错误的。CDATA 部分只会将标记作为字符数据处理,它们不会改变换行处理。

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

完全一样

<Address><![CDATA[15 Sample St
Example Bay
Some Country]]></Address>

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

于 2008-08-24T14:40:11.673 回答
2

我认为唯一真正的问题是它使 XML 更难阅读。例如

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

如果漂亮的 XML 不是问题,我可能不会担心它,只要它可以工作。如果需要考虑漂亮的 XML,我会将显式换行符转换为<br />标签或\n在将它们嵌入 XML 之前。

于 2008-08-10T18:29:36.380 回答
1

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

如果 XML 是自动生成的——如果换行符或明确的\n标志被解析成
——那么就没有什么可担心的了。您的输入中可能没有任何其他 XML,因此完全不弄乱 XML 会更干净。

如果标签是手动处理的,如果你问我,换行仍然更干净。

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

如果 XML 看起来很糟糕(尤其是在自动生成时),Tidy可以提供帮助,尽管它与 HTML 相比与 XML 相比更有效。

于 2008-08-10T18:43:21.220 回答
1

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

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

带有行标签的尴尬伴随着普通的 XML,并且在编码恐怖方面引起了很多争论。http://www.codinghorror.com/blog/archives/001139.html

于 2008-08-11T13:12:35.817 回答
1

XML 规范对空格换行以及回车有一些特别的规定。因此,如果您将自己限制为真正的换行符(x0A),您应该没问题。然而,许多编辑工具会重新格式化 XML 以“更好地呈现”,并且可能会去掉特殊的语法。比“<line></line>”的想法更健壮、更简洁的方法是简单地使用命名空间并嵌入 XHTML 内容,例如:

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

当涉及到标准词汇表时,无需重新发明轮子。

于 2008-08-19T21:49:34.273 回答
0

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

于 2008-08-10T20:41:55.100 回答
-1

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

于 2008-08-10T18:26:24.590 回答
-1

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

因此,与其寻求用 <br /> 替换 \n,不如将整个块包装在 <pre>

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

于 2008-08-10T19:36:55.557 回答
-1

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

于 2008-08-10T20:35:18.577 回答
-2

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

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

于 2008-08-10T21:13:23.630 回答