“格式不正确”XML和“无效”XML之间有什么区别?

时间:2013-05-01 18:38:40

标签: xml well-formed

I made a claim that an unescaped ampersand in some XML source was "invalid XML"LarsH然后提到:

  从技术上讲,XML“格式不正确”。 “无效”意味着它无法符合特定架构。

我试图找到“无效”XML和“格式不正确”XML的官方定义来确认LarsH的声明,但我无法在官方规范中找到任何定义来进行比较。

“无效”XML与“格式不正确”的XML有何不同?

3 个答案:

答案 0 :(得分:7)

我认为一般差异很明显,而Nathan和Shawn的答案是准确的。提出问题的不明确的案例是:

  • 如果文件格式不正确,它是否有效?可以无效吗?

对于非格式良好的XML片段,我从长时间使用XML中得到的印象是,有效性问题未定义。但我无法从XML规范中证明这一点。

理论上

XML规范中的official definition of "valid"是:

  

定义:如果XML文档具有关联文档,则该文档有效   类型声明以及文档是否符合约束   表达在其中。

请注意,此定义以“XML文档”开头。 XML document is defined as

  

定义:数据对象是格式良好的XML文档,如   在本说明书中定义。此外,XML文档是有效的   如果它遇到某些进一步的限制。

这意味着上述“有效”的定义仅适用于XML文档,即适用于格式良好的数据对象。关于不是(格式良好的)XML文档的数据对象,“有效”的定义没有说什么。

各种诠释学问题仍然存在......

  • 我们是否将上述有效定义视为详尽无遗......也就是说,我们是否假设没有其他关于有效性的定义是明确的? (如果是这样,我们忽略基于XML Schema或RelaxNG等的/ validity。)

  • 我们是否将“if”视为“仅限于”?例如。一个没有DTD的格式良好的XML文档是否也被视为有效?如果一个格式不正确的XML文档符合其关联的DTD,它是否可以被认为是有效的? (Bob DuCharmes seems to say此定义的意思是“仅限于”:“XML规范明确指出有效文档必须格式正确 [强调我的] 。 “)

  • 我们可以假设每个不“有效”的XML文档都是“无效”吗?我认同。但是每个数据对象呢?例如。是否存在未定义的有效性状态? XML规范从未定义术语“无效”,为解释留下了一些余地。很明显,如果X无效,则无效。但反过来说:如果X无效,那是否意味着它必须无效?

在规范之外看看受尊敬的XML专家...... Bob DuCharme writes,一个XML“无效的文档...... 可能仍然是格式良好的......”,暗示一个无效的XML文档可能格式正确。但同样,“无效”与“无效”相同吗?此外,according to the spec XML文档的定义很好。从技术上讲,无效 XML文档必须仍然是格式良好的。我相信DuCharme在这里稍微松散地使用了术语。

我们还需要牢记SGML后代语言的更广泛背景,包括HTML。 This web page给出了根据W3C验证器服务认为有效的XHTML页面示例,但格式不正确。但是当我run them by the validator service时,它并没有说它们是有效的。

在实践中

实际上,任何验证引擎都难以处理任何格式不正确的XML。它必须首先“纠正”输入数据,猜测预期的,正确的XML结构应该是什么,并且没有该过程的官方规范。因此,实施结果可能会有很大差异。验证将依赖于实现。

结论

出于这个原因,我会说,出于所有实际目的,如果数据对象不是一个(格式良好的)XML文档,那么声称数据对象是无效的XML会产生误导。如果你的意思是(如the case of the unescaped ampersand所示)数据不是格式良好的XML,那么术语“无效”就是传达了错误的东西,即使可以说它可以被认为是真的。这有点像说蜘蛛不是果蝇因为它有超过六条腿,当你的意思是蜘蛛不是昆虫因为它有六个以上腿。确实,蜘蛛不是果蝇,但没有传达预期的意义。

尽管如此,我没有从XML规范中看到一个铁定的论据,该论证说明格式不正确的XML数据对象是否(或必须)无效。如果我们遵循Bob DuCharme,我们可能应该这样做,我们可以安全地断定一个格式不正确的XML的数据对象无法生效。

当然,如果我们说,指的是一个格式不正确的数据对象,它是无效的,我们会引起混淆,我们可能很容易被理解为声称除了它没有格式良好之外的其他东西。 / p>

我希望进一步阅读XML专家可以让我们更好地了解这个问题的共识,即使答案不像XML规范那样正式。

答案 1 :(得分:5)

格式正确表示句法正确性 - 例如打开带有结束标签的标签,打开引号具有结束引号,正确转义某些字符等等。

无效的XML表示与某些特定结构的一致性 - 例如某个节点是否存在,或者是否应该将另一个节点嵌套在其他节点之下。要无效,需要对XML结构被认为有效的定义。通常,这可以在XML模式(DTD或.xsd)中找到。如果我声明我希望XML只包含顶级节点,并且有人向我发送带有子节点的节点的XML,我会声明它“无效”,即使XML可能形式完美且语法正确。

另见Is there a difference between 'valid xml' and 'well formed xml'?

答案 2 :(得分:1)

the W3C spec中有一个格式正式的定义。唯一一次在XML的规范中使用“无效”这个词是在描述某些XML是否符合DTD的上下文中。

有效性始终与某些DTD或架构有关。格式良好对所有XML文档都有相同的标准。