“独立”指令在XML中意味着什么?

时间:2011-04-07 09:10:39

标签: xml

standalone”指令在XML文档中的含义是什么?

5 个答案:

答案 0 :(得分:184)

standalone声明是告诉解析器忽略DTD中任何标记声明的一种方式。此后,DTD仅用于验证。

举个例子,考虑一下简陋的<img>标签。如果查看XHTML 1.0 DTD,您会看到一个标记声明,告诉解析器<img>标记必须是EMPTY且拥有srcalt属性。当浏览器浏览XHTML 1.0文档并找到<img>标记时,它应该注意到DTD需要srcalt属性,如果它们不存在则添加它们。它还会自动关闭<img>标记,因为它应该是EMPTY。这就是XML specification“标记声明可能会影响文档内容”的含义。然后,您可以使用standalone声明告诉解析器忽略这些规则。

您的解析器是否实际执行此操作是另一个问题,但是符合标准的验证解析器(如浏览器)应该。

请注意,如果您没有指定DTD,那么独立声明“没有意义”,因此除非您还指定了DTD,否则没有理由使用它。

答案 1 :(得分:97)

  • 独立指令是XML声明的可选属性。
  • 有效值为yesno,其中no为默认值。
  • 该属性仅在使用DTD时才相关。 (使用schema而不是DTD时,该属性无关紧要。)
  • standalone="yes"表示XML处理器必须仅使用DTD进行验证。在这种情况下,将用于:
    • 属性的默认值
    • 实体声明
    • 归一化
  • 请注意,如果文档使用外部DTD,standalone="yes"可能会添加有效性限制。当文档包含需要修改XML的内容时,例如属性的默认值,standalone="yes"使用then the document is invalid
  • standalone="yes"可能有助于优化文档处理的效果。

来源:The standalone pseudo-attribute is only relevant if a DTD is used

答案 2 :(得分:20)

standalone描述当前的XML文档是否依赖于外部标记声明。

W3C在“可扩展标记语言(XML)1.0(第五版)”中描述了它的用途:

答案 3 :(得分:10)

  

标记声明可能会影响   通过的文件内容   从XML处理器到   应用;例子是属性   默认值和实体声明。该   独立文件声明,其中   可能看起来是XML的一个组成部分   声明,是否发出信号   有这样的声明   出现在文档实体的外部   或在参数实体中。 [定义:   外部标记声明是   定义为标记声明   发生在外部子集或中   参数实体(外部或   内部,后者包括在内   因为非验证处理器是   不需要阅读它们。)

http://www.w3.org/TR/xml/#sec-rmd

答案 4 :(得分:7)

standalone=yes声明的目的是保证文档中的信息可以仅基于内部DTD被忠实地检索,即文档可以独立地#34;没有外部参考。验证独立文档可确保非验证处理器具有可用于正确解析文档的所有信息。

如果文档没有外部DTD,并且内部DTD没有参数实体引用,则独立声明没有用处,因为这些文档已经隐式独立。

以下是使用standalone=yes的实际效果。

  • 强制处理器在使用外部DTD或参数实体引用解析文档时抛出错误,如果文档包含对未在内部DTD中声明的实体的引用(除了参数实体的替换文本为非验证处理器不需要解析这个); ampltgtaposquot是唯一的例外情况

  • 在解析未声明为独立的文档时,非验证处理器可以在遇到参数实体引用时立即停止解析内部DTD。将文档声明为独立文件会强制非验证处理器解析内部DTD中的标记声明,即使它们忽略了一个或多个参数实体引用也是如此。

  • 如果在文档中找到以下任何内容,并且它们各自的声明位于外部DTD或参数实体替换文本中,则强制验证处理器抛出错误:

    • 具有默认值的属性,如果它们没有明确提供其值
    • 实体引用(ampltgtaposquot
    • 除外
    • 带有标记化类型的属性,如果属性的值将通过标准化修改
    • 元素内容的元素,如果内容中出现任何空格

非验证处理器可能会考虑检索外部DTD并扩展非独立文档的所有参数实体引用,即使它没有义务这样做,即设置standalone=yes理论上可以提高性能非验证处理器(剧透警报:它可能不会产生影响)。

这里的其他答案不完整或不正确,主要的误解是

  

独立声明是一种告诉解析器忽略DTD中任何标记声明的方法。此后,DTD仅用于验证。

  

独立=&#34;是&#34;表示XML处理器必须仅使用DTD进行验证。

恰恰相反,将文档声明为独立文件实际上会强制非验证处理器解析它通常必须忽略的内部声明(即在忽略的参数实体引用之后的那些声明)。非验证处理器仍必须使用内部DTD中的信息来提供默认属性值并规范化标记化属性,因为这与验证无关。