“有效的XML”和“良好的XML”之间有什么区别吗?

我没有意识到有什么不同,但是一位同事说,虽然他不能支持它, 有什么区别?

有一个区别,是的。 遵循xml标准的xml被认为是正确的,而遵循DTD的xml被认为是有效的。

有效的XML是成功通过DTDvalidation的XML。

格式良好的XML就是XML,所有的标签都按照正确的顺序closures,如果它有一个声明,那么它在文件中具有合适的属性。

换句话说,有效性是指语义,良构是指语法。

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

格式与有效的XML

格式 良好意味着文本对象符合W3C对XML的 要求 。

有效意味着格式良好的XML可以满足指定模式提供的附加要求。


官方定义

根据W3C关于XML的build议 :

[定义:数据对象是一个XML格式的文档,如果它是格式良好的 ,就像本规范中定义的那样。 另外,如果XML文档符合某些进一步的约束条件,则该文档是有效的 。]


观察:

  • 不正确的文档不是XML。 (通常使用格式良好的XML,但技术上是冗余的。)
  • 有效意味着forms良好。
  • 良好的forms并不意味着是有效的。
  • 虽然W3C关于XML的推荐规定了DTD的有效性 ,但传统使用允许将该术​​语用于符合通过XSD , RELAX NG , Schematron或其他方法指定的XML模式。

什么导致一个文件的例子是…

不健全

  • 元素缺less结束标记(并且不是自闭合)。
  • 元素重叠但没有正确的嵌套: <a><b></a></b>
  • 一个属性值缺less一个与开盘报价相匹配的收盘价。
  • <&在内容中使用,而不是&lt &amp;
  • 存在多个根元素。
  • 存在多个XML声明,或者在文档顶部以外出现XML声明。

无效

  • XML模式缺less一个元素或属性,但是它是必需的。
  • 使用元素或属性,但是XML模式未定义。
  • 元素的内容与XML模式指定的内容不匹配。
  • 属性的值与XML模式指定的types不匹配。

命名空间结构良好的

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

注意:

XMLbuild议[ XML名称 ]中的名称空间为包含冒号字符的名称赋予一个含义。 因此,除了名称空间用途之外,作者不应在XML名称中使用冒号,但XML处理器必须接受冒号作为名称字符。

因此,另一个名称空间格式良好的术语在XML 1.0 W3Cbuild议书中的命名空间中定义,这意味着所有XML规则的格式良好, 还有pipe理命名空间和命名空间前缀的规则。

通俗地说,“良构”这个术语通常用在名称空间格式更精确的地方。 然而,这是一个比本答案中所描述的格式良好和有效XML之间的区别要less的实用性结果的小技术方式。

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

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

一个XML文档格式正确无法生效。 所有XML文档都保持相同的格式标准(由W3发布的RFC)。 一个XML文档可能对某些模式有效,而对其他模式无效。 有许多模式语言,其中许多都是基于XML的。

格式良好的XML是符合语言语法要求的XML。 不要错过任何结束标签,让所有的单例标签都使用<whatever />而不是<whatever> ,并且以正确的顺序结束标签。

有效的XML是使用DTD的XML,并符合其所有要求。 所以,如果你使用的属性不当,你违反了DTD,是无效的。

所有有效的XML格式良好,但并非所有格式良好的XML都是有效的。

如果满足标准所规定的所有XML文档的要求,那么XML格式良好 – 因此,例如具有单个根节点,节点具有正确嵌套,所有节点具有结束标记(或使用空节点之前的斜杠简写closuresangular括号),属性被引用等。格式良好只意味着它遵守XML的规则,因此可以正确parsing。

XML是有效的,如果它将validation对DTD或模式。 这种情况明显地不同于一种情况 – 对一种模式有效的XML对于另一种模式是无效的,尽pipe它仍然是格式良好的。

如果XML格式不正确,则无法正确parsing – parsing器只会抛出exception或报告错误。 这是通用的,不pipe你的XML包含什么。 只有一次parsing,才能检查其有效性。 依赖这个域或上下文,需要一个DTD或模式来validation。 对于简单的XML文档,您可能没有DTD或模式,在这种情况下,您无法知道XML是否有效 – 在这种情况下,概念或有效性不适用。 当然,这并不意味着你不能使用它,只是意味着你不能判断它是否有效。

W3C在XML规范中定义了在创buildXML文档时需要遵循的特定规则。 这样的规则的例子包括正好有一个根元素,每个开始标签有结束标签,属性值使用单引号或双引号等等。 如果一个XML文档遵循所有这些规则,就说它是格式良好的文档,XMLparsing器可以用来parsing和处理这些文档。

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

所有有效的XML文档格式良好,但反过来并不总是如此。 格式良好的XML文档不一定必须是有效的。

我将添加有效的XML也意味着它是格式良好的,但格式良好的XML不一定是有效的。

除了前面提到的DTD之外,还有其他两种描述和validationXML文档的方式: XMLSchema和RelaxNG ,这两种方法比DTD更容易使用和支持更多的function。

如果XML确认为DTD规则,那么它是一个有效的XML。 如果一个XML文档符合XML规则(所有启动的标签都是closures的,就有一个根元素等等),那么它就是一个格式良好的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 

基于“形成良好”与“有效”的理论

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

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

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

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