“有效 xml”和“格式正确的 xml”之间有什么区别吗?

Is there any difference between 'valid xml' and 'well formed xml'?

提问人:user18931 提问时间:9/26/2008 最后编辑:shA.tuser18931 更新时间:1/19/2021 访问量:77036

问:

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

XML 验证 XSD DTD

评论


答:

86赞 Kilhoffer 9/26/2008 #1

是的,是有区别的。

符合 XML 标准的 XML 被视为格式正确,而符合 DTD 的 xml 被视为有效。

评论

11赞 Torsten Marek 9/26/2008
或者 XML Schema,或者 RelaxNG 或 Schematron,就此而言。
24赞 Quentin 6/7/2010
可能值得指出的是,格式良好是有效性的先决条件。
1赞 LarsH 5/2/2013
@Quentin:这是很重要的一点,也是公认的XML专家同意的一点(lists.w3.org/Archives/Public/www-xml-linking-comments/...“规范明确指出......”);但从XML规范来看,这并不完全明显。你有引文吗?你是基于 w3.org/TR/REC-xml/#dt-valid 吗?
0赞 9/24/2014
@LarsH 根据定义,如果 XML 文档的格式不正确,则无法根据 DTD 或架构对其进行检查。
1赞 kjhughes 11/12/2014
@LarsH,您寻求的规范参考(确认 Quentin 的正确断言,即格式良好是有效性的先决条件)是: 定义:如果数据对象格式正确,则该数据对象是 XML 文档,如本规范中所定义的那样。此外,如果 XML 文档满足某些进一步的约束,则该文档有效。 请参阅下面的回答,了解进一步的有效 XML 与格式正确的 XML 注意事项。谢谢。
29赞 Vinko Vrsalovic 9/26/2008 #2

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

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

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

因此,您可以拥有无效的格式正确的 XML。

评论

11赞 LarsH 5/2/2013
我不同意第三段。这两个术语都没有说明语义(某物的意义)。DTD 无法指示特定元素或属性的含义。这将是Web Ontology Language等努力的目标。相反,格式良好是指低级别的语法(也许更准确地称为词汇正确性),而有效性是指更高级别的语法(如果您愿意,可以称之为“结构性”)。
0赞 Charles Graham 9/26/2008 #3

好吧,从定义上讲,格式不正确的 XML 不是 XML。Poeple 通常将有效的 XML 称为遵循特定架构(XSD 或 DTD)的 XML。

1赞 Joel Coehoorn 9/26/2008 #4

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

6赞 ZachPruckowski 9/26/2008 #5

格式良好的 XML 是满足语言语法要求的 XML。不遗漏任何结束标签,使用所有单例标签而不仅仅是 ,并按正确的顺序排列结束标签。<whatever /><whatever>

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

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

5赞 Simon Forrest 9/26/2008 #6

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

如果 XML 将针对 DTD 或架构进行验证,则 XML 有效。这显然因情况而异 - 对一个架构有效的 XML 对另一个架构无效,即使它仍然格式正确。

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

17赞 harpo 9/26/2008 #7

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

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

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

1赞 Narasimhareddy 6/7/2010 #8

如果 XML 正在确认 DTD 规则,则它是有效的 XML。 如果 XML 文档符合 XML 规则(所有标记 开始是封闭的,有一个根元素等)然后它是一个 格式正确的 XML。

0赞 Rachna Garg 1/27/2011 #9

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

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

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

评论

0赞 Kent Pawar 12/12/2013
你好@Rachna。这很好地解释了验证部分,但没有解释我们何时可以将 XML 文件称为“格式良好”......
3赞 harsha 8/14/2011 #10

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

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

所有有效的 XML 文档格式都正确,但反之亦然。格式正确的 XML 文档不一定必须有效。

1赞 Kent Pawar 12/12/2013 #11

摘自 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

基于理论:“格式良好”与有效

41赞 kjhughes 9/14/2014 #12

格式正确的 XML 与有效的 XML

格式正确意味着文本对象满足 W3CXML 要求。

有效表示格式正确的 XML 满足指定架构给出的其他要求。


官方定义

根据 W3C 对 XML 的建议

[定义:如果数据对象的格式正确,则数据对象是 XML 文档,如本规范中所定义。此外, 如果 XML 文档满足某些进一步的约束,则该文档有效


观察:

  • 格式不正确的文档不是 XML。(格式正确的 XML 是常用的,但在技术上是多余的。
  • 有效意味着格式良好。
  • 格式良好并不意味着有效。
  • 尽管 W3C XML 建议有效性定义为针对 DTD,但传统用法允许将该术语应用于通过 XSDRELAX NG、Schematron 或其他方法指定的 XML 架构的一致性。

导致文档成为...

格式不正确:

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

无效

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

命名空间格式良好

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

注意:

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

因此,XML 1.0 W3C 建议中的命名空间中定义了另一个术语 namespace-well-formed,该术语暗示了格式正确的所有 XML 规则以及控制命名空间和命名空间前缀的规则。

通俗地说,术语 well-formed 通常用于命名空间格式更精确的地方。但是,这是一种次要的技术方式,其实际影响不如本答案中描述的格式良好的 XML 与有效 XML 之间的区别。

评论

1赞 Mathias Müller 2/26/2016
这已经是一个很好的答案,但也许添加一个关于命名空间的注释会有所帮助,即关于命名空间格式良好的属性?如您所知,命名空间是初学者的常见陷阱,许多人会将具有命名空间问题的文档描述为“格式不正确”。
1赞 kjhughes 9/29/2016
谢谢,@MathiasMüller。我根据您的要求添加了对命名空间格式良好的解释。
0赞 Attila 5/16/2018 #13

请参阅 W3 学校上的 XML DTD

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

针对 DTD 验证的 XML 文档既是“格式正确”,又是 “有效”。