提问人:pauldoo 提问时间:8/11/2008 最后编辑:Chrispauldoo 更新时间:12/16/2015 访问量:4478
对 XML 文档中的换行符敏感是“不好的做法”吗?
Is it "bad practice" to be sensitive to linebreaks in XML documents?
问:
我正在生成一些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>
似乎用这样的标签将我的文本可能是多行的每个地方包裹起来真的很尴尬。
答:
是的,我认为使用 CDATA 块可以保护空格。尽管某些解析器 API 允许您保留空格。
我认为唯一真正的问题是它使XML更难阅读。例如
<Something>
<Contains>
<An>
<Address>15 Sample St
Example Bay
Some Country</Address>
</An>
</Contains>
</Something>
如果漂亮的XML不是一个问题,我可能不会担心它,只要它能工作。如果漂亮的XML是一个问题,我会将显式换行符转换为标签,或者在将它们嵌入到XML中之前。<br />
\n
这取决于您如何读取和编写 XML。
如果 XML 是自动生成的 - 如果换行符或显式 \n 标志被解析为
换行符或显式 \n 标志 - 则无需担心。您的输入可能没有任何其他 XML,因此完全不弄乱 XML 会更干净。
如果你问我,如果标签是手动处理的,那么只换行仍然更干净。
例外情况是,如果您使用 DOM 从 XML 中获取某些结构。在这种情况下,换行符显然是邪恶的,因为它们不能正确地表示层次结构。不过,听起来层次结构与您的应用程序无关,因此换行符听起来就足够了。
如果 XML 看起来很糟糕(尤其是在自动生成时),Tidy 可以提供帮助,尽管它在 HTML 中比在 XML 中效果更好。
通常认为依赖换行符是不好的做法,因为这是区分数据的一种脆弱方式。虽然大多数 XML 处理器会保留您在 XML 中放置的任何空格,但不能保证。
真正的问题是,大多数将 XML 输出为可读格式的应用程序都考虑 XML 可互换中的所有空格,并且可能会将这些换行符折叠到单个空格中。这就是为什么您的 XSLT 必须跳过这些障碍才能正确呈现数据的原因。使用“br”标签将大大简化转换。
另一个潜在的问题是,如果你在XML编辑器中打开你的XML文档并漂亮地打印它,你很可能会丢失这些换行符。
如果您继续使用换行符,请确保在“address”中添加 xml:space=“preserve” 属性。(如果您使用的是 DTD,则可以在 DTD 中执行此操作。
一些人建议阅读
- XML.com 的一篇文章说:
XML 应用程序似乎经常需要 对空白的骑士态度 因为关于地方的规则 一个 XML 文档,其中空格 没关系,有时给这些 应用程序自由添加或 删除某些地方的空格。
你真正应该做的是将你的XML转换为保留空格的格式。
因此,与其试图用 <br />替换 \n,不如将整个块包装在 <pre> 中
这样一来,您的地址就会在功能上得到保留(无论您是否包含换行符),并且 XSTL 可以选择是否在结果中保留空格。
我建议你应该添加换行符,或者使用换行符实体 -<br/>

我看不出标签有什么问题。
显然,数据的可视化对您来说很重要,重要到足以将其保留在您的数据中(通过第一个示例中的换行符)。好。那就真的留着吧,不要靠“魔法”来为你留着。保留您以后需要的每一位数据,并且无法从保存的数据部分完美地推断出来,即使它是可视化数据(换行符和其他格式),也要保留它。您的用户(其他开发人员的最终用户)花时间根据自己的喜好格式化该数据 - 要么告诉他(API 文档/输入附近的文本)您不打算保留它,要么 - 只是保留它。<Line>
如果您需要保留换行符,请使用 CDATA 块,如 tweakt 所述
否则要小心。大多数时候,换行符会被 XML 软件保留,但有时它们不会,而且你真的不想依赖那些只能巧合地工作的东西
使用属性而不是文本节点来存储数据怎么样:
<Address Street="15 Sample St" City="Example Bay" State="" Country="Some Country"/>
我知道属性与文本节点的使用是一个经常争论的话题,但我在 95% 的时间里都坚持使用属性,并且没有因此而遇到任何麻烦。
这可能是一个有点欺骗性的例子,因为在这种情况下,地址有点非规范化。但是,这是一个合理的权衡,因为地址字段很难规范化。 如果你让换行符带有重要信息,你就是在取消规范化,让邮局解释换行符的含义。
我想说的是,通常这不是一个大问题,但在这种情况下,我认为 Line 标签是最正确的,因为它清楚地表明您实际上并没有解释这些线条在不同文化中可能的含义。(请记住,大多数用于输入地址的表单都有邮政编码等,以及地址行 1 和 2。
使用行标记的尴尬与普通 XML 一起提供,并且在编码恐怖方面一直备受争议。http://www.codinghorror.com/blog/archives/001139.html
XML 规范对空格、换行符和回车符有话要说。因此,如果您将自己限制为真正的换行符 (x0A),您应该没问题。但是,许多编辑工具会重新格式化 XML 以获得“更好的呈现”,并可能摆脱特殊语法。比“<行></行>”的想法更健壮、更简洁的方法是简单地使用命名空间并嵌入 XHTML 内容,例如:
<Address xmlns="http://www.w3.org/1999/xhtml">15 Sample St<br />Example Bay<br />Some Country</Address>
当涉及到标准词汇时,无需重新发明轮子。
很少有人说CDATA块会允许你保留换行符。这是错误的。CDATA 部分只会将标记作为字符数据进行处理,而不会更改换行符处理。
<Address>15 Sample St
Example Bay
Some Country</Address>
完全相同
<Address><![CDATA[15 Sample St
Example Bay
Some Country]]></Address>
唯一的区别是不同的 API 如何报告这一点。
上一个:100% 最小高度 CSS 布局
下一个:HTML 版本选择 [已关闭]
评论