为什么XML有这样详细的结束标记?

时间:2010-12-06 20:10:52

标签: xml verbosity

是的,这可能不应该让我感到烦恼。

但它确实!!

为什么XML有这样详细的结束标记?它不仅使文档对人类更加丑陋,而且不必要地引入了不匹配(或拼写错误!)打开和关闭标记的风险。

即使我们想要关闭标记,为什么我们是否需要在结束标记中包含开始标记的名称? XML中没有任何歧义,因为在关闭外部标签之前,最内层的标签必须才会关闭!

例如:

<thisIsSomewhatLong>
    Hello, world!
</thisIsSomewhatLong>

......比以下更加冗长:

<thisIsSomewhatLong>
    Hello, world!
</>

它无法解决人类或计算机的任何歧义。

有谁知道这条规则的基本原理是什么?不允许空的结束标签可以避免哪些风险?

6 个答案:

答案 0 :(得分:18)

因为它提高了可读性, XML 的诞生并不是高效或简洁,只是为了易于使用......如果你认为让</>不会产生歧义,那么只是因为你缩进代码。如果省略缩进(与在结束标记中使用名称相比,这是一个非常弱的约束),那么它就变得一团糟。

一个简单的例子?

<A><B><C><D>foo</><D>bar</></><H>baz</></></>

您认为它如此易读吗?如果没有计算结束标签,很难理解<H>的位置。

答案 1 :(得分:15)

我可以看到一个很大的优势:错过关闭标签(由人或计算机)立即捕获,而不是像Insufficient closing tags provided; please read through your 1000 line file and figure out where it happened.

那样得到错误

答案 2 :(得分:6)

你的建议相当于S-Expression。你知道,所有Lisp都是写的,例如(thisisSomewhatLong Hello, world!)。确实有人认为这样做更好,因为它更简洁。他们是对的, 更简洁。但无论喜欢与否,这种冗长也具有优势。最值得注意的是,它允许早期错误检测。有了SExprs或类似的东西,错过了一个关闭的paren或者有一个太多,意味着“有不匹配的parens,好运找到你”(如果你很幸运 - 如果你犯了两次这样的错误,它会变得均匀,并且很容易搞砸所有标记 - 虽然它当然会产生一个不符合模式的结构(假设你有这样的东西),它可以允许稍微好一点的错误报告)。

另见"XML is not S-Expressions"

答案 3 :(得分:3)

虽然您可能会在网上阅读,但XML主要是计算机可读的,因此,使用开始和结束标记进行有效性检查。

有点人性化;它可以高效地存储许多应用程序将使用的数据,但最终存在这些标记,因此解析器可以读取该数据,检查标记是否匹配并对其执行有意义的操作。

许多人不喜欢XML的冗长,所以如果你不这样做,也不要担心。你并不孤单。

答案 4 :(得分:1)

风险是迷失

    ...
    ...
    ...
    </>
   </>
  </>
 </>
</>

BTW,它可以在没有结束标记名称的情况下进行验证。

答案 5 :(得分:1)

我认为这是为了提高可读性,如上所述。然而,它违反了DRY原则,因此引入了错误来源,当然它会使你的文档大小膨胀,如果你通过网络传递它会倍加糟糕,这是现在常见的事情。

是的,您不需要计算结束标记,但这可以抵消这样的错误风险:

<color>red</colour>

必须始终保持同步=压力的冗余定义。这就是为什么我几乎抵制XML(如果可能的话)并选择YAML,它没有遇到这个问题,而且与XML一样具有表现力(减去DTD,我多年来都没有向我证明任何价值)

另一个替代方案是JSON,它同样避免了这种冗余问题,但是JSON缺少内部引用,并且在任何情况下YAML都是JSON的完整超集。