我不知道有什么不同,但一位同事说有,尽管他无法支持。如果有,有什么区别?
13 回答
格式良好的与有效的 XML
有效意味着格式良好的 XML 满足指定模式给出的附加要求。
官方定义
[定义:数据对象是一个 XML 文档,如果它是 格式良好的,如本规范中定义的那样。此外,如果 XML 文档满足某些进一步的约束,则它是有效的。]
观察:
- 格式不正确的文档不是 XML。(格式良好的 XML很常用,但在技术上是多余的。)
- 有效意味着格式良好。
- 格式良好并不意味着有效。
- 尽管W3C XML 推荐标准定义了针对 DTD 的有效性,但传统用法允许将该术语应用于符合通过XSD、RELAX NG、Schematron或其他方法指定的 XML 模式。
导致文档成为...的原因的示例
格式不正确:
- 一个元素缺少一个结束标签(并且不是自动关闭的)。
- 没有正确嵌套的元素重叠:
<a><b></a></b>
- 属性值缺少与开始引号匹配的结束引号。
<
or&
用于内容而不是<
or&
。- 存在多个根元素。
- 存在多个 XML 声明,或者 XML 声明出现在文档顶部以外的位置。
无效的
- 缺少元素或属性,但 XML 模式需要。
- 元素或属性已使用但未由 XML 模式定义。
- 元素的内容与 XML 模式指定的内容不匹配。
- 属性的值与 XML 模式指定的类型不匹配。
命名空间格式良好
从技术上讲,XML 中的组件名称中允许使用冒号字符。但是,冒号只能用于命名空间的名称中:
笔记:
XML 建议中的命名空间 [ XML 名称] 为包含冒号字符的名称分配了含义。因此,作者不应在 XML 名称中使用冒号,除非是出于命名空间的目的,但 XML 处理器必须接受冒号作为名称字符。
因此,另一个术语namespace-well-formed被定义在Namespaces in XML 1.0 W3C Recommendation中,它暗示了所有的 XML 格式良好的规则以及那些管理命名空间和命名空间前缀的规则。
通俗地说,格式良好的术语通常用于命名空间格式正确的地方。但是,这是一种次要的技术方式,其实际后果不如此答案中描述的格式良好的 XML 与有效的 XML之间的区别。
有效 XML 是针对 DTD 成功验证的 XML。
格式良好的 XML 是所有标记都以正确顺序关闭的 XML,如果它有一个声明,它在文件中的第一件事就是具有正确的属性。
换句话说,有效性是指语义,格式良好是指语法。
所以你可以有无效的格式良好的 XML。
正如其他人所说,格式良好的 XML 符合 XML 规范,有效的 XML 符合给定的模式。
另一种说法是,格式良好的 XML 在词汇上是正确的(可以被解析),而有效的 XML 在语法上是正确的(可以与已知的词汇和语法相匹配)。
XML 文档在格式正确之前是无效的。所有 XML 文档都遵循相同的格式标准(W3 提出的 RFC)。一个 XML 文档可以对某些模式有效,而对其他模式无效。有许多模式语言,其中许多本身是基于 XML 的。
格式良好的 XML 是符合语言语法要求的 XML。不遗漏任何结束标签,使用所有单例标签<whatever />
而不是 just <whatever>
,并且结束标签的顺序正确。
有效的 XML 是使用 DTD 并符合其所有要求的 XML。因此,如果您不正确地使用属性,就会违反 DTD 并且无效。
所有有效的 XML 都是格式正确的,但并非所有格式正确的 XML 都是有效的。
如果满足标准规定的所有 XML 文档的要求,则 XML 是格式良好的 - 因此诸如具有单个根节点、具有正确嵌套的节点、所有节点具有结束标记(或使用斜线的空节点速记之前)右尖括号),引用的属性等。格式正确仅意味着它遵守 XML 规则,因此可以正确解析。
如果 XML 将针对 DTD 或模式进行验证,那么它就是有效的。这显然因情况而异——对一种模式有效的 XML 对另一种模式无效,即使它仍然是格式良好的。
如果 XML 格式不正确,则无法正确解析 - 解析器只会抛出异常或报告错误。这是通用的,您的 XML 包含什么并不重要。只有在解析后才能检查其有效性。此域或上下文相关,并且需要一个 DTD 或模式来验证。对于简单的 XML 文档,您可能没有 DTD 或模式,在这种情况下,您无法知道 XML 是否有效——概念或有效性在这种情况下根本不适用。当然,这并不意味着你不能使用它,它只是意味着你无法判断它是否有效。
W3C 在 XML 规范中定义了创建 XML 文档时需要遵循的某些规则。此类规则的示例包括只有一个根元素,每个开始标签都有结束标签,属性值使用单/双引号等等。如果 XML 文档遵循所有这些规则,则称其为格式良好的文档,并且 XML 解析器可用于解析和处理此类文档。
文档类型定义 (DTD) 或 XML 模式可用于定义特定类 XML 文档的结构和内容。这包括父子关系详细信息、属性列表、数据类型信息、值限制等。除了格式良好的规则外,如果一个 XML 文档还遵循关联的 DTD/Schema 中指定的规则,则称为是一个有效的 XML 文档。
所有有效的 XML 文档都是格式良好的,但反过来并不总是正确的。格式良好的 XML 文档不一定是有效的。
我要补充一点,有效的 XML 也意味着它是格式良好的,但格式良好的 XML 不一定是有效的。
如果 XML 符合 DTD 规则,那么它就是一个有效的 XML。如果一个 XML 文档符合 XML 规则(所有开始的标签都是封闭的,有一个根元素等),那么它就是一个格式良好的 XML。
摘自可扩展标记语言 (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
基于理论:“格式良好”与有效
好吧,根据定义,格式不正确的 XML 不是 XML。人们通常将有效的 XML 称为符合特定模式(XSD 或 DTD)的 XML。
DTD 是文档类型定义的首字母缩写词。这是对一系列 XML 文件的内容的描述。这是 XML 1.0 规范的一部分,它允许描述和验证给定文档实例是否符合详细说明其结构和内容的一组规则。
验证是根据 DTD(更一般地说是根据一组构造规则)检查文档的过程。
验证过程和构建 DTD 是 XML 生命周期中最困难的两个部分。简而言之,DTD 定义了文档中所有可能的元素,文档树的正式形状是什么(通过定义元素的允许内容;文本、允许的子列表的正则表达式或混合内容即文本和儿童)。DTD 还定义了所有元素的有效属性以及这些属性的类型。
请参阅W3 学校的 XML DTD:
具有正确语法的 XML 文档称为“格式良好”。
针对 DTD 验证的 XML 文档既“格式正确”又“有效”。