“有效的 xml”和“格式良好的 xml”之间有啥区别吗?

Posted

技术标签:

【中文标题】“有效的 xml”和“格式良好的 xml”之间有啥区别吗?【英文标题】:Is there any difference between 'valid xml' and 'well formed xml'?“有效的 xml”和“格式良好的 xml”之间有什么区别吗? 【发布时间】:2010-09-13 03:58:47 【问题描述】:

我不知道有什么不同,但一位同事说有,尽管他无法支持。如果有,有什么区别?

【问题讨论】:

【参考方案1】:

格式良好的与有效的 XML

格式良好表示文本对象符合W3C requirements 的being XML。

有效表示格式良好的 XML 满足指定架构给出的额外要求。


官方定义

根据W3C Recommendation for XML:

[定义:一个数据对象是一个 XML 文档,如果它是 well-formed,如本规范中所定义。除此之外 如果 XML 文档满足某些进一步的约束,则它是 valid。]


观察:

格式不正确的文档不是 XML。 (格式良好的 XML 很常用,但在技术上是多余的。) 有效意味着格式良好。 格式良好并不意味着有效。 虽然W3C Recommendation for XML 将validity 定义为反对DTD,但常规使用允许将该术​​语应用于通过XSD、RELAX NG、Schematron 或其他方法指定的XML 模式的一致性。

导致文档成为...的示例

格式不正确:

元素缺少结束标记(并且不是自动关闭的)。 元素重叠而没有正确嵌套:<a><b></a></b> 属性值缺少与 开场白。 <& 用于内容,而不是 &lt&。 存在多个根元素。 存在多个 XML 声明,或者 XML 声明出现在文档顶部以外的位置。

无效

缺少元素或属性,但 XML 架构需要。 使用了一个元素或属性,但未由 XML 架构定义。 元素的内容与 XML 架构指定的内容不匹配。 属性的值与 XML 架构指定的类型不匹配。

命名空间格式良好

从技术上讲,XML 中的组件名称中允许使用冒号字符。但是,冒号 should 仅用于命名空间的名称中:

注意:

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

因此,Namespaces in XML 1.0 W3C Recommendation 中定义了另一个术语 namespace-well-formed,它暗示了所有用于良好格式的 XML 规则加上那些管理命名空间和命名空间前缀的规则。

通俗地说,术语格式良好 经常用于命名空间格式良好 更准确的地方。但是,与此答案中描述的格式良好的 XML 与有效的 XML 之间的区别相比,这是一种次要的技术方式。

【讨论】:

这已经是一个很好的答案,但也许它会有助于添加关于命名空间的注释,即关于作为 namespace-well-formed 的属性?如您所知,命名空间对于初学者来说是一个常见的陷阱,许多人会将存在命名空间问题的文档描述为“格式不正确”。 谢谢,@MathiasMüller。我已根据您的要求添加了对 namespace-well-formed 的说明。【参考方案2】:

有区别,是的。

遵循XML standard 的XML 被认为是格式正确的,而遵循DTD 的xml 被认为是有效的。

【讨论】:

或 XML Schema、RelaxNG 或 Schematron,就此而言。 可能值得指出的是,格式正确是有效性的先决条件。 @Quentin:这是很重要的一点,公认的 XML 专家都同意这一点(lists.w3.org/Archives/Public/www-xml-linking-comments/…“规范明确表示......”);但从 XML 规范中并不完全明显。你有引用吗?你是基于w3.org/TR/REC-xml/#dt-valid 吗? @LarsH 根据定义,如果 XML 文档格式不正确,则无法根据 DTD 或模式进行检查。 @LarsH,您所寻找的spec reference(证实了 Quentin 的正确断言,即格式正确是有效性的先决条件)是:定义:数据对象是 XML 文档 如果它格式正确,如本规范中所定义。此外,如果 XML 文档满足某些进一步的限制,则它是有效的。 See my answer below for further valid XML vs well-formed XML considerations. 谢谢。【参考方案3】:

见XML DTD on W3 Schools:

具有正确语法的 XML 文档称为“格式良好”。

针对 DTD 验证的 XML 文档既是“格式良好”又是 “有效”。

【讨论】:

【参考方案4】:

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

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

XML 文档在格式正确之前是无效的。所有 XML 文档都遵循相同的格式标准(W3 提出的 RFC)。一个 XML 文档可以对某些模式有效,而对其他模式无效。有许多模式语言,其中许多本身都是基于 XML 的。

【讨论】:

【参考方案5】:

嗯,按照定义,格式不正确的 XML 不是 XML。人们通常将有效的 XML 称为符合特定模式(XSD 或 DTD)的 XML。

【讨论】:

【参考方案6】:

取自Extensible Markup Language (XML) 1.0 (Fifth Edition) - W3C Recommendation 26 November 2008:

[定义:如果数据对象是格式良好的,那么它就是一个 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

基于理论:"Well Formed" vs. Valid

【讨论】:

【参考方案7】:

W3C 在 XML 规范中定义了创建 XML 文档时需要遵循的某些规则。此类规则的示例包括只有一个根元素,每个开始标签都有结束标签,属性值使用单引号/双引号,等等。如果一个 XML 文档遵循所有这些规则,则称其为格式良好的文档,并且可以使用 XML 解析器来解析和处理此类文档。

文档类型定义 (DTD) 或 XML 模式可用于定义特定类 XML 文档的结构和内容。这包括父子关系详细信息、属性列表、数据类型信息、值限制等。除了格式良好的规则外,如果一个 XML 文档还遵循关联的 DTD/Schema 中指定的规则,则称为是一个有效的 XML 文档。

所有有效的 XML 文档都是格式良好的,但反过来并不总是正确的。格式正确的 XML 文档不一定是有效的。

【讨论】:

【参考方案8】:

DTD 是文档类型定义的首字母缩写。这是对一系列 XML 文件的内容的描述。这是 XML 1.0 规范的一部分,允许描述和验证给定文档实例是否符合详细说明其结构和内容的一组规则。

验证是根据 DTD(更一般地,根据一组构造规则)检查文档的过程。

验证过程和构建 DTD 是 XML 生命周期中最困难的两个部分。简而言之,DTD 定义了文档中所有可能的元素,文档树的正式形状是什么(通过定义元素的允许内容;文本、允许的子列表的正则表达式或混合内容即文本和儿童)。 DTD 还定义了所有元素的有效属性以及这些属性的类型。

【讨论】:

你好@Rachna。这很好地解释了验证部分,但没有解释我们何时可以将 XML 文件称为“格式良好”...【参考方案9】:

如果 XML 符合 DTD 规则,那么它就是一个有效的 XML。 如果 XML 文档符合 XML 规则(所有标签 开始是关闭的,有一个根元素等)然后它是一个 格式良好的 XML。

【讨论】:

【参考方案10】:

如果满足标准规定的所有 XML 文档的要求,则 XML 是格式良好的 - 因此诸如具有单个根节点、具有正确嵌套的节点、所有节点具有结束标记(或使用空节点简写)右尖括号前的斜线),引用的属性等。格式正确仅意味着它遵守 XML 规则,因此可以正确解析。

如果 XML 将针对 DTD 或模式进行验证,则它是有效的。这显然因情况而异——对一种模式有效的 XML 对另一种模式无效,即使它仍然是格式良好的。

如果 XML 格式不正确,则无法正确解析 - 解析器只会抛出异常或报告错误。这是通用的,您的 XML 包含什么并不重要。只有在解析后才能检查其有效性。此域或上下文相关,并且需要一个 DTD 或模式来验证。对于简单的 XML 文档,您可能没有 DTD 或模式,在这种情况下,您无法知道 XML 是否有效——概念或有效性在这种情况下根本不适用。当然,这并不意味着你不能使用它,它只是意味着你无法判断它是否有效。

【讨论】:

【参考方案11】:

格式良好的 XML 是符合语言语法要求的 XML。不要遗漏任何结束标签,让所有单例标签都使用&lt;whatever /&gt; 而不仅仅是&lt;whatever&gt;,并且结束标签的顺序正确。

有效的 XML 是使用 DTD 并符合其所有要求的 XML。因此,如果您不正确地使用某个属性,就会违反 DTD 并且无效。

所有有效的 XML 都是格式正确的,但并非所有格式正确的 XML 都是有效的。

【讨论】:

【参考方案12】:

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

【讨论】:

【参考方案13】:

有效的 XML 是成功通过 DTD 验证的 XML。

格式良好的 XML 是一种以正确顺序关闭所有标签的 XML,如果它有声明,则它首先在文件中具有正确的属性。

换句话说,有效性是指语义,格式良好是指语法。

所以你可以有无效的格式良好的 XML。

【讨论】:

我不同意第三段。这两个术语都没有说明语义(某物的含义)。 DTD 无法指示特定元素或属性的含义。这将是 Web Ontology Language 等努力的目标。相反,格式良好是指语法的低层次(也许更好地称为词法正确性),而有效性是指更高层次的语法(如果你愿意,可以称之为“结构”)。

以上是关于“有效的 xml”和“格式良好的 xml”之间有啥区别吗?的主要内容,如果未能解决你的问题,请参考以下文章

配置文件不是格式良好的 XML #2

如何在 Scala 中生成格式良好的 XML?

Quickbooks Web 连接器“响应不是格式良好的 XML”错误

XSL 编码特殊字符 XML 格式正确

XML高速入门

我需要使用 log4net 以 xml 格式登录