对XML文档中的换行符敏感是"坏习惯"吗?

时间:2020-03-05 18:38:51  来源:igfitidea点击:

我正在生成一些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,我将显式换行符转换为<br />标签或者\ n,然后再将其嵌入XML中。

回答

这取决于我们如何读写XML。

如果XML是自动生成的,并且将换行符或者显式\ n标志解析为
那就不用担心了。输入中可能没有任何其他XML,因此完全不弄乱XML更加干净。

如果标签是手动操作的,请问我,换行还是比较干净的。

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

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

回答

通常,依靠换行符被认为是不好的做法,因为这是区分数据的脆弱方法。尽管大多数XML处理器会保留我们放入XML中的所有空格,但不能保证。

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

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

如果我们确实继续使用换行符,请确保在"地址"中添加xml:space =" preserve"属性。 (如果我们正在使用DTD,则可以在DTD中执行此操作。)

一些建议阅读

  • XML.com上的一篇文章说:
XML applications often seem to take a
  cavalier attitude toward whitespace
  because the rules about the places in
  an XML document where whitespace
  doesn't matter sometimes give these
  applications free rein to add or
  remove whitespace in certain places.
  • 有关空白的XSL列表帖子的集合。

回答

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

因此,与其尝试将\ n替换为<br />,不如将整个代码块包装在<pre>中

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

回答

我建议我们或者添加&lt;br/>换行符,或者使用换行符实体

回答

我没有看到&lt;Line>标签有什么问题。
显然,数据的可视化对我们很重要,足以将其保留在数据中(通过第一个示例中的换行符)。美好的。然后真正保留它,不要依靠"魔术"为我们保留它。保留以后需要的所有数据,并且无法从保存的数据部分中完美推断出这些数据,即使是可视化数据(换行符和其他格式)也要保留。用户(另一位开发人员的最终用户)花了一些时间格式化数据,或者告诉他(输入附近的API文档/文本)我们不想保留它,或者只是保留它。

回答

如果需要保留换行符,请使用CDATA块,如调整所示

否则要当心。多数情况下,换行符将由XML软件保存,但有时不会保留,我们真的不希望依赖偶然发生的事情

回答

使用属性而不是文本节点存储数据该怎么办:

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

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

回答

这可能是一个欺骗性的示例,因为在这种情况下地址是未规范化的。这是一个合理的权衡,但是由于地址字段难以规范化。
如果使换行符携带重要信息,则我们将使规范化不足,并使邮局解释换行符的含义。

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

普通的XML附带有line标签的笨拙,并且在编码恐怖方面引起了很多争论。 http://www.codinghorror.com/blog/archives/001139.html

回答

XML规范对于空白和换行符以及回车特别有话要说。因此,如果我们将自己限制为真正的换行(x0A),则应该没问题。但是,许多编辑工具将重新格式化XML以"更好地呈现",并且有可能摆脱特殊的语法。比" <line> </ line>"想法更健壮和更清洁的方法是简单地使用名称空间并嵌入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如何报告此情况。