“valid xml”和“well formed xml”有什么区别吗?

91

我之前没有意识到有什么区别,但一个同事说有区别,尽管他无法支持这种说法。如果有的话,有什么区别?

13个回答

86

确实有区别。

遵循XML标准的XML被认为是格式良好的,而遵循DTD的XML被认为是有效的。


11
或者一个XML Schema,或者RelaxNG,或者Schematron,反正都可以。 - Torsten Marek
24
值得指出的是,格式良好是有效性的先决条件。 - Quentin
1
@Quentin: 这是一个重要的观点,也是公认的 XML 专家所同意的(http://lists.w3.org/Archives/Public/www-xml-linking-comments/2000JanMar/0058.html “规范明确说明…”),但在 XML 规范中并不完全明显。您有证据支持吗?您是基于http://www.w3.org/TR/REC-xml/#dt-valid 吗? - LarsH
根据定义,如果一个XML文档不是格式良好的,它就无法与DTD或模式进行检查。 - user764357
1
@LarsH,你所寻找的规范参考(确认Quentin正确地断言,格式良好是有效性的先决条件)是:定义:如果数据对象格式良好,则为XML文档,如本规范中所定义。此外,如果XML文档满足某些进一步的约束条件,则该文档有效。请参见下面我的答案,以获取更多关于有效XML与格式良好XML的考虑。谢谢。 - kjhughes
显示剩余2条评论

41

格式良好与有效的XML

格式良好指文本对象符合W3C要求,可以作为XML

有效指格式良好的XML符合指定模式给出的额外要求。


官方定义

根据 W3C XML 推荐标准

[定义:如果数据对象符合规范,则它是一个 XML 文档。此外,如果 XML 文档满足某些进一步的约束条件,则它是有效的。]


观察:

  • 一个不规范的文档不是XML。(规范的XML通常被使用但技术上冗余。)
  • 有效意味着格式正确。
  • 格式正确并不意味着有效。
  • 尽管W3C建议XML有效性定义为针对DTD,但传统用法允许该术语适用于符合通过XSDRELAX NGSchematron或其他方法指定的XML模式。

导致文档不规范的原因示例:

未规范:

  • 元素缺少结束标签(且不是自闭合的)。
  • 元素重叠而没有正确嵌套:<a><b></a></b>
  • 属性值缺少与开头引号匹配的结束引号。
  • 内容中使用了<&而非&lt&amp;
  • 存在多个根元素。
  • 存在多个XML声明,或XML声明出现在文档顶部以外的位置。

无效:

  • 元素或属性在XML模式中缺失但是必需的。
  • 元素或属性在XML模式中未定义但是被使用了。
  • 元素的内容与XML模式指定的内容不匹配。
  • 属性的值与XML模式指定的类型不匹配。

命名空间格式良好

在XML中,组件名称中允许使用冒号字符。然而,冒号应该仅用于命名空间目的:

注意:

XML Namespaces建议[XML Names]为包含冒号字符的名称分配了一种含义。因此,作者不应在XML名称中使用冒号,除非是为了命名空间目的,但XML处理器必须接受冒号作为名称字符。

因此,另一个术语命名空间格式良好Namespaces in XML 1.0 W3C Recommendation中定义,它意味着所有关于XML格式良好的规则加上命名空间和命名空间前缀的规则。

在口语中,人们通常使用“well-formed”这个术语,但更精确的说法应该是“namespace-well-formed”。然而,这只是一个次要的技术问题,不如文章中所描述的“well-formed vs valid XML”区别重要。


1
这已经是一个很好的答案了,但也许加上一个关于命名空间的注释会有所帮助,即关于具有“命名空间格式良好”属性的性质(https://www.w3.org/TR/xml-names/#Conformance)?正如您所知,命名空间是初学者常见的陷阱,许多人会将存在命名空间问题的文档描述为“格式不良”。 - Mathias Müller
1
谢谢,@MathiasMüller。我已经根据您的要求添加了命名空间格式正确的解释。 - kjhughes

29

有效的XML是针对DTD进行验证后成功验证的XML。

格式良好的XML是指所有标签按正确顺序关闭,并且如果有声明,则在文件中首先具有适当属性。

换句话说,有效性涉及语义,而格式良好性涉及语法。

因此,您可以拥有无效但格式良好的XML。


11
我不同意第三段的观点。两个术语都没有提及语义(某事物的含义)。DTDs没有办法表明特定元素或属性的含义,这是Web本体语言等工作的目标。良好格式化只涉及语法的低级别(也许更好地称为词法正确性),而有效性涉及语法的更高级别(如果你愿意,可以称之为“结构性”)。 - LarsH

17

正如其他人所说,格式良好的 XML 符合 XML 规范,而有效的 XML 则符合给定的模式。

另一种表述方式是,格式良好的 XML 在词法上是正确的(可以解析),而有效的 XML 在语法上是正确的(可以匹配已知的词汇和语法)。

只有格式良好的 XML 才能成为有效的 XML。所有 XML 文档都必须符合相同的格式要求(由 W3 发布的 RFC)。一个 XML 文档可以针对某些模式是有效的,而针对其他模式则无效。有许多模式语言,其中许多本身就是基于 XML 的。


6

规范的XML满足语言的句法要求,没有漏掉任何闭合标签,所有单例标签都应该使用<whatever />而不是只有<whatever>,并且关闭标签应按正确顺序排列。

有效的XML使用DTD并符合其所有要求,所以如果你错误地使用属性,则违反了DTD并且无效。

所有有效的XML都是规范的,但并非所有规范的XML都是有效的。


5

如果XML文档符合标准中规定的所有要求,比如只有一个根节点、节点正确嵌套、所有节点都有关闭标签(或使用空节点简写即在闭合尖括号前加斜杠)、属性被引用等,则XML格式就是良好的。良好的格式意味着它遵循XML规则,因此可以正确解析。

如果XML可以通过DTD或模式进行验证,则该XML格式是有效的。这显然因情况而异-针对一个模式有效的XML可能不会针对另一个模式有效,即使它仍然是良好的格式。

如果XML格式不良好,则无法正确解析-分析器将简单地抛出异常或报告错误。这是通用的,无论您的XML包含什么。只有一旦它被解析后才能检查其有效性。这是依赖于领域或上下文,并需要DTD或模式进行验证。对于简单的XML文档,您可能没有DTD或模式,在这种情况下,您无法知道XML是否有效-有效性概念在这种情况下根本不适用。当然,这并不意味着您不能使用它,只是意味着您无法确定它是否有效。


3
在XML规范中,W3C定义了一些需要遵循的规则来创建XML文档。这些规则的例子包括只有一个根元素、每个起始标签都有结束标签、使用单引号/双引号来表示属性值等。如果一个XML文档遵循所有这些规则,它被称为格式良好的文档,可以使用XML解析器来解析和处理这样的文档。
文档类型定义(DTD)或XML模式可用于定义特定类别的XML文档的结构和内容。这包括父子关系细节、属性列表、数据类型信息、值限制等。除了格式良好的规则外,如果一个XML文档还遵循相关DTD /模式中指定的规则,则称其为有效的XML文档。
所有有效的XML文档都是格式良好的,但反过来并不总是正确的。格式良好的XML文档不一定是有效的。

1
如果XML符合DTD规则,则它是有效的XML。 如果XML文档符合XML规则(所有标签都已关闭,存在根元素等),则它是格式良好的XML。

1

我要补充的是,有效的XML也意味着它是格式良好的,但格式良好的XML不一定是有效的。


1

摘自 可扩展标记语言(XML) 1.0 (第五版) - W3C建议书,2008年11月26日

[定义:如果数据对象符合本规范中定义的格式要求,则它是一个XML文档。此外,如果XML文档满足某些进一步的约束条件,则它是有效的。]


对于那些更喜欢伪代码而不是一大堆文字的人…… :)

IF is_well_formed(<XML_doc>) THEN
    # It is well-formed, and can be parsed
    IF is_valid(<XML_doc>) THEN
        # Well-formed and ALSO valid. Hurray! 
        # **A valid XML doc, is a well-formed doc!**
    ELSE
        # Only well-formed, NOT valid
    END IF
ELSE
    # Not well-formed, or valid!
END IF

FUNCTION is_well_formed
    IF <does_not_contain_syntax,_spelling,_punctuation,_grammar_errors,_etc._errors> THEN
        RETURN TRUE
    ELSE 
        RETURN FALSE
    END IF
END FUNCTION 

FUNCTION is_valid
    IF <markup_of_the_XML_document_matches_"some"_defined_standard> THEN
        # Standards used to validate XML could be a DTDs or XML Schemas, referenced within the XML document
        RETURN TRUE
    ELSE 
        RETURN FALSE
    END IF
END FUNCTION

基于这个理论:"良好格式化" vs. 有效性

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接