我之前没有意识到有什么区别,但一个同事说有区别,尽管他无法支持这种说法。如果有的话,有什么区别?
我之前没有意识到有什么区别,但一个同事说有区别,尽管他无法支持这种说法。如果有的话,有什么区别?
有效指格式良好的XML符合指定模式给出的额外要求。
根据 W3C XML 推荐标准:
[定义:如果数据对象符合规范,则它是一个 XML 文档。此外,如果 XML 文档满足某些进一步的约束条件,则它是有效的。]
未规范:
<a><b></a></b>
<
或&
而非<
或&
。无效:
在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”区别重要。
有效的XML是针对DTD进行验证后成功验证的XML。
格式良好的XML是指所有标签按正确顺序关闭,并且如果有声明,则在文件中首先具有适当属性。
换句话说,有效性涉及语义,而格式良好性涉及语法。
因此,您可以拥有无效但格式良好的XML。
正如其他人所说,格式良好的 XML 符合 XML 规范,而有效的 XML 则符合给定的模式。
另一种表述方式是,格式良好的 XML 在词法上是正确的(可以解析),而有效的 XML 在语法上是正确的(可以匹配已知的词汇和语法)。
只有格式良好的 XML 才能成为有效的 XML。所有 XML 文档都必须符合相同的格式要求(由 W3 发布的 RFC)。一个 XML 文档可以针对某些模式是有效的,而针对其他模式则无效。有许多模式语言,其中许多本身就是基于 XML 的。
规范的XML满足语言的句法要求,没有漏掉任何闭合标签,所有单例标签都应该使用<whatever />
而不是只有<whatever>
,并且关闭标签应按正确顺序排列。
有效的XML使用DTD并符合其所有要求,所以如果你错误地使用属性,则违反了DTD并且无效。
所有有效的XML都是规范的,但并非所有规范的XML都是有效的。
如果XML文档符合标准中规定的所有要求,比如只有一个根节点、节点正确嵌套、所有节点都有关闭标签(或使用空节点简写即在闭合尖括号前加斜杠)、属性被引用等,则XML格式就是良好的。良好的格式意味着它遵循XML规则,因此可以正确解析。
如果XML可以通过DTD或模式进行验证,则该XML格式是有效的。这显然因情况而异-针对一个模式有效的XML可能不会针对另一个模式有效,即使它仍然是良好的格式。
如果XML格式不良好,则无法正确解析-分析器将简单地抛出异常或报告错误。这是通用的,无论您的XML包含什么。只有一旦它被解析后才能检查其有效性。这是依赖于领域或上下文,并需要DTD或模式进行验证。对于简单的XML文档,您可能没有DTD或模式,在这种情况下,您无法知道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