17

是的,这可能不应该打扰我。

但它确实!

为什么 XML 有如此冗长的结束标记?它不仅使文档对人类来说更难看,而且不必要地引入了不匹配(或拼写错误!)打开和关闭标签的风险。

即使我们想要求结束标签,为什么我们需要在结束标签中包含开始标签的名称?XML 中从来没有任何歧义,因为最里面的标签必须在关闭外部标签之前关闭!

例如:

<thisIsSomewhatLong>
    Hello, world!
</thisIsSomewhatLong>

...比:

<thisIsSomewhatLong>
    Hello, world!
</>

它不能解决任何歧义,无论是对人类还是对计算机。

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

4

6 回答 6

20

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

一个简单的例子?

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

你认为它的可读性很强吗?<H>如果不计算结束标签,很难理解在哪里。

于 2010-12-06T20:13:17.157 回答
17

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

于 2010-12-06T20:15:23.273 回答
8

你的建议相当于S-Expression。你知道,所有 Lisp 都是用它来编写的,例如(thisisSomewhatLong Hello, world!). 确实有些人认为这更好,因为它不那么冗长。他们是对的,它那么冗长。但不管你喜不喜欢,这种冗长也有好处。最值得注意的是,它允许早期错误检测。使用 SExprs 或类似的,缺少一个接近的括号或有一个太多,这意味着“有不匹配的括号,祝你好运”(如果你很幸运 - 如果你两次犯这样的错误,它就会平衡并且很容易搞砸所有标记——虽然它当然可以产生一个不符合模式的结构(假设你有这样的东西),它可以允许更好的错误报告)。

另请参阅“XML 不是 S-Expressions”

于 2010-12-06T20:18:08.613 回答
3

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

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

许多人不喜欢 XML 的冗长,所以如果您也不喜欢,请不要担心。你不是一个人。

于 2010-12-06T20:13:31.930 回答
2

我想这是为了可读性,如上所述。但是,它违反了 DRY 原则,因此引入了错误来源,当然它会增加您的文档大小,如果您通过网络传递它,这会更加糟糕,这在当今是很常见的事情。

诚然,您不需要计算结束标签,但这被以下错误的风险所抵消:

<color>red</colour>

必须始终保持同步的冗余定义 = 压力。这就是为什么我几乎抵制 XML(如果可能的话)并选择 YAML,它不会受到这个问题的困扰,并且在其他方​​面都像 XML 一样具有表现力(减去 DTD,在我这些年来还没有向我展示任何价值) .

另一种选择是 JSON,它同样避免了这种冗余问题,但 JSON 缺少内部引用,并且无论如何 YAML 是 JSON 的完整超集。

于 2011-03-31T22:04:58.563 回答
1

风险是迷路

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

顺便说一句,它可以在没有结束标签名称的情况下很好地验证。

于 2010-12-06T20:16:32.967 回答