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

在XML文档中'standalone'指令是什么意思?

165140 次浏览

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

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

标记声明可以影响 传递的文档内容 从XML处理器到 应用程序;例如属性 默认值和实体声明。的 独立文档声明 可以作为XML的组件出现 声明,表示是否 有这样的宣言 出现在文档实体的外部 或者参数实体。[定义: 外部标记声明为 定义为标记声明 发生在外部子集或内部的 参数实体(外部的或 内部的,后者包括在内 因为非验证处理器是

.

.

< a href = " http://www.w3.org/TR/xml/ sec-rmd”rel = " noreferrer " > http://www.w3.org/TR/xml/ sec-rmd < / >

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

例如,考虑简单的<img>标记。如果你看一下XHTML 1.0 DTD,你会看到一个标记声明,告诉解析器<img>标记必须是空的,并且具有srcalt属性。当浏览器浏览XHTML 1.0文档并发现<img>标记时,它应该注意到DTD要求srcalt属性,如果它们不存在,就添加它们。它还会自关闭<img>标记,因为它应该是EMPTY。这就是<img>0所说的“标记声明可以影响文档的内容”。然后你可以使用standalone声明告诉解析器忽略这些规则。

您的解析器是否真正做到这一点是另一个问题,但是符合标准的验证解析器(比如浏览器)应该做到。

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

  • 独立指令是XML声明上的一个可选属性。
  • 有效值为yesno,其中no为默认值。
  • 该属性仅在使用DTD时才相关。(当使用模式而不是DTD时,该属性是不相关的。)
  • 在这种情况下,它将被用于:
    • 属性的默认值
    • 实体声明
    • 归一化
    • 李< / ul > < / >
    • 注意,如果文档使用外部DTD, standalone="yes"可能会添加有效性约束。当文档包含需要修改XML的内容时,例如属性的默认值,并且standalone="yes"被使用那么该文件就是无效的
    • standalone="yes"可以帮助优化文档处理的性能。

    来源:独立伪属性仅在使用DTD时才相关

standalone=yes声明的目的是保证文档内部的信息只能基于内部DTD被忠实地检索到,即文档可以“独立”,没有外部引用。验证独立文档可确保非验证处理程序拥有正确解析文档所需的所有信息。

如果文档没有外部DTD,内部DTD没有参数实体引用,那么独立声明就没有任何意义,因为这些文档已经是隐式独立的。

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

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

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

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

    • 属性,如果它们没有显式地提供它们的值,则使用默认值
    • 实体引用(除了ampltgtaposquot)
    • 具有标记化类型的属性(如果属性的值将通过规范化修改)
    • 带有元素内容的元素,如果其内容中出现空白
    • 李< / ul > < / >

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


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

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

    standalone="yes"意味着XML处理器必须只使用DTD进行验证。

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