'有效的xml'和'格式良好的xml'之间有什么区别吗?

时间:2008-09-25 16:53:09

标签: xml validation xsd dtd

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

14 个答案:

答案 0 :(得分:78)

有区别,是的。

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

答案 1 :(得分:27)

有效的XML是成功针对DTD进行验证的XML。

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

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

因此,您可以使用格式错误的XML。

答案 2 :(得分:25)

格式良好与有效XML

格式良好 表示文字对象符合W3C requirementsbeing XML

有效 表示格式良好的XML符合指定架构提供的其他要求。


官方定义

根据W3C Recommendation for XML

  

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


观察:

  • 格式不正确的文档不是XML。 (格式良好的XML 是常用的,但在技术上是多余的。)
  • 有效意味着形成良好。
  • 结构良好并不意味着有效。
  • 虽然W3C Recommendation for XML定义了validity来反对DTD,但是传统的使用允许该术语用于符合通过XSDRELAX NG,{{ {3}}或其他方法。

导致文档的原因示例......

格式不正确

  • 元素缺少结束标记(并且不是自动关闭)。
  • 没有正确嵌套的元素重叠:<a><b></a></b>
  • 属性值缺少与匹配的结束引号 打开报价。
  • <&用于内容而不是&lt&amp;
  • 存在多个根元素。
  • 存在多个XML声明,或者XML声明不会出现在文档的顶部。

无效

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

命名空间结构良好的

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

  

注意:

     

XML建议书中的命名空间[should]指定了一个   含义为包含冒号字符的名称。因此,作者   除了命名空间之外,不应该在XML名称中使用冒号,   但XML处理器必须接受冒号作为名称字符。

因此,XML Names中定义了另一个术语namespace-well-formed,它隐含了格式良好的所有XML规则 plus 那些管理名称空间和名称空间前缀。< / p>

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

答案 3 :(得分:16)

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

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

XML文档在格式正确之前无法生效。所有XML文档都遵循相同的格式(W3推出的RFC)。一个XML文档对某些模式有效,对其他模式无效。有许多模式语言,其中许多都是基于XML的。

答案 4 :(得分:6)

良好形成的XML是满足语言语法要求的XML。不要错过任何结束标记,让所有单身标记使用<whatever />而不是<whatever>,并使您的结束标记按正确的顺序排列。

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

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

答案 5 :(得分:4)

如果符合标准规定的所有XML文档的要求,XML就是格式良好的 - 所以像拥有一个根节点,正确嵌套节点,所有节点都有一个结束标记(或使用空节点的简写)良好形成只是意味着它遵守XML规则,因此可以正确解析。

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

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

答案 6 :(得分:3)

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

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

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

答案 7 :(得分:1)

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

答案 8 :(得分:1)

除了前面提到的DTD之外,还有另外两种描述和验证XML文档的方法是XMLSchemaRelaxNG,这两种方式都比DTD更容易使用和支持更多功能。< / p>

答案 9 :(得分:1)

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

答案 10 :(得分:1)

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

答案 11 :(得分:0)

嗯,根据定义,格式不健全的XML不是XML。 Poeple通常将有效XML称为遵循特定模式(XSD或DTD)的XML。

答案 12 :(得分:0)

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

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

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

答案 13 :(得分:0)

请参阅XML DTD on W3 Schools

  

具有正确语法的XML文档称为“Well Formed”。

     

针对DTD验证的XML文档都是“Well Formed”和   “有效”。