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

Clo*_*boy 16 xml verbosity

是的,这可能不应该让我烦恼.

但它确实!!

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

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

例如:

<thisIsSomewhatLong>
    Hello, world!
</thisIsSomewhatLong>
Run Code Online (Sandbox Code Playgroud)

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

<thisIsSomewhatLong>
    Hello, world!
</>
Run Code Online (Sandbox Code Playgroud)

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

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

Jac*_*ack 18

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

一个简单的例子?

<A><B><C><D>foo</><D>bar</></><H>baz</></></>
Run Code Online (Sandbox Code Playgroud)

你认为它是如此可读?如果<H>没有计算结束标签,很难理解在哪里.

  • 嗯。我理解你的观点(以及其他人)。不过,在这个例子中,我认为需要缩进才能使其可读*有或没有*结束标签。 (2认同)

Mic*_*sky 15

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

  • 这正是大多数C/C++/C#编译器工作的原因......它们将到达你的1000行文件的末尾,然后说"语法错误 - 第999行意外的EOF - 预期}" (6认同)

小智 7

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

另请参阅"XML不是S表达式".