我声称某些 XML 源中未转义的 & 符号是“无效的 XML”。LarsH然后提到:
从技术上讲,XML “格式不正确”。“无效”意味着它不符合特定模式。
我试图找到“无效”XML 和“格式不正确”的 XML 的官方定义来确认 LarsH 的说法,但我无法在官方规范中找到任何定义来进行比较。
“无效”的 XML 与“格式不正确”的 XML 有何不同?
我声称某些 XML 源中未转义的 & 符号是“无效的 XML”。LarsH然后提到:
从技术上讲,XML “格式不正确”。“无效”意味着它不符合特定模式。
我试图找到“无效”XML 和“格式不正确”的 XML 的官方定义来确认 LarsH 的说法,但我无法在官方规范中找到任何定义来进行比较。
“无效”的 XML 与“格式不正确”的 XML 有何不同?
我认为一般差异很明显,内森和肖恩的答案是准确的。提出问题的不清楚的极端案例是:
我从长期使用 XML 得到的印象是,对于非格式良好的 XML 片段,有效性问题是未定义的。但我无法从 XML 规范中证明这一点。
XML 规范中“有效”的官方定义是:
定义:如果 XML 文档具有关联的文档类型声明并且文档符合其中表达的约束条件,则它是有效的。
请注意,此定义以“一个 XML 文档”开头。XML 文档定义为:
定义:一个数据对象是一个 XML 文档,如果它是格式良好的,如本规范中定义的那样。此外,如果 XML 文档满足某些进一步的约束,则它是有效的。
这意味着上述“有效”的定义只适用于 XML 文档,即格式良好的数据对象。关于不是(格式良好的)XML 文档的数据对象,“有效”的定义没有说明任何内容。
各种解释学问题仍然存在……
我们是否认为上述有效的定义是详尽无遗的……也就是说,我们是否假设没有其他关于有效性的文章是确定的?(如果是,我们忽略基于 XML Schema 或 RelaxNG 等的 in/validity)
我们是否将“如果”视为“仅当”?例如,没有DTD 的格式良好的XML 文档也可以被认为是有效的吗?如果格式不正确的 XML 文档符合其关联的 DTD,是否可以认为它是有效的?(Bob DuCharmes似乎说这个定义意味着“仅当”:“XML 规范明确规定有效文档必须是格式良好的[强调我的]。”)
我们可以假设每个不是“有效”的 XML 文档都是“无效的”吗?我认同。但是每个数据对象呢?例如,是否存在未定义的有效性状态?XML 规范从未定义术语“无效”,为解释留下了一些余地。很明显,如果 X 无效,则它无效。但反过来:如果 X 无效,是否意味着它一定是无效的?
看看规范之外的受人尊敬的 XML 专家……Bob DuCharme写道,一个 XML“无效的文档……可能仍然是格式良好的……”,这意味着一个 XML 文档是'无效可能不是格式正确的。但是,“无效”是否与“无效”相同?此外,根据规范,XML 文档的定义是良好的。因此,从技术上讲,无效的XML 文档仍然必须是格式良好的。我相信 DuCharme 在这里使用的术语有些松散。
我们还需要牢记 SGML 后裔语言的更广泛背景,包括 HTML。此网页提供了 XHTML 页面的示例,根据 W3C 验证器服务它认为这些页面是有效的,但格式不正确。但是,当我通过验证器服务运行它们时,它并没有说它们是有效的。
在实践中,任何验证引擎都很难处理格式不正确的 XML。它必须首先“纠正”输入数据,猜测预期的正确 XML 结构应该是什么,并且该过程没有官方规范。因此,实现之间的结果可能会有很大差异。验证将依赖于实现。
出于这个原因,我会说,从所有实际目的来看,如果数据对象不是(格式良好的)XML 文档,则声称数据对象是无效的 XML 是一种误导。如果您的意思是传达数据不是格式良好的 XML(如在未转义的 & 符号的情况下),那么“无效”一词是在传达错误的东西,即使可以说是正确的。这有点像说蜘蛛不是果蝇,因为它有六个以上的腿,而你的意思是蜘蛛不是昆虫,因为它有六个以上的腿。蜘蛛确实不是果蝇,但没有传达预期的含义。
尽管如此,我没有从 XML 规范中看到一个铁定的论点,即不是格式良好的 XML 的数据对象是否可以(或必须)无效。如果我们遵循 Bob DuCharme(我们可能应该这样做),我们可以有把握地得出结论,不是格式良好的 XML 的数据对象是无效的。
当然,如果我们说,指的是不是格式良好的 XML 的数据对象,它是无效的,我们会引起混淆,并且我们很容易被理解为声称它不是格式良好的其他东西。
我希望进一步阅读有关 XML 的专家可以让我们更好地了解关于这个问题的共识,即使答案不像 XML 规范那样正式。
格式正确表示句法正确——比如开始标签有结束标签,开始引号有结束引号,某些字符的正确转义等等。
无效的 XML 表示符合某些特定结构——例如某个节点是否存在,或者另一个节点是否应该嵌套在其他节点下。要无效,需要对认为有效的 XML 结构有一些定义。这通常可以在 XML 模式(DTD 或 .xsd)之类的东西中找到。如果我声明我希望 XML 只包含顶级节点,并且有人向我发送包含带有子节点的节点的 XML,我会声明它“无效”,即使 XML 格式可能完全正确且语法正确。
W3C 规范中有格式良好的正式定义。在 XML 规范中唯一使用“无效”一词是在描述某些 XML 是否符合 DTD 的上下文中。
有效性始终与某些 DTD 或模式有关。格式正确对所有 XML 文档都有相同的标准。