XML 中的“独立”指令是啥意思?
Posted
技术标签:
【中文标题】XML 中的“独立”指令是啥意思?【英文标题】:What does the 'standalone' directive mean in XML?XML 中的“独立”指令是什么意思? 【发布时间】:2011-07-31 12:31:37 【问题描述】:XML 文档中的“standalone
”指令是什么意思?
【问题讨论】:
【参考方案1】:standalone
描述当前 XML 文档是否依赖于外部标记声明。
W3C 在“可扩展标记语言(XML)1.0(第五版)”中描述了它的用途:
2.9 Standalone Document Declaration【讨论】:
【参考方案2】:标记声明会影响 文件的内容,如通过 从 XML 处理器到 应用;例子是属性 默认值和实体声明。这 独立文件声明,其中 可能作为 XML 的一个组件出现 声明,信号是否 有这样的声明 出现在文档实体的外部 或在参数实体中。 [定义: 外部标记声明是 定义为标记声明 发生在外部子集中或 参数实体(外部或 内部,后者包括在内 因为非验证处理器是 不需要阅读它们)。]
http://www.w3.org/TR/xml/#sec-rmd
【讨论】:
我投了反对票,因为这应该以中等 QI 的正常人可以理解的方式表达。【参考方案3】:standalone
声明是一种告诉解析器忽略DTD 中的任何标记声明的方法。此后,DTD 仅用于验证。
例如,考虑不起眼的<img>
标签。如果您查看Xhtml 1.0 DTD,您会看到一个标记声明告诉解析器<img>
标记必须为空并且具有src
和alt
属性。当浏览器浏览 XHTML 1.0 文档并找到 <img>
标记时,它应该注意到 DTD 需要 src
和 alt
属性,如果它们不存在则添加它们。它还会自动关闭<img>
标签,因为它应该是空的。这就是XML specification 所指的“标记声明会影响文档的内容”。然后您可以使用standalone
声明告诉解析器忽略这些规则。
您的解析器是否真的这样做是另一个问题,但符合标准的验证解析器(如浏览器)应该这样做。
请注意,如果您不指定 DTD,那么独立声明“没有意义”,因此除非您还指定 DTD,否则没有理由使用它。
【讨论】:
示例需要进一步修改。具有“standalone='no'” 通常不会关闭未关闭的 XML 标记(这是 SGML 的一个特性,但不是 XML 的特性)。验证将失败。它也不会为必需的属性提供值。 “独立声明是告诉解析器忽略 DTD 中的任何标记声明的一种方式。”这是不正确的。使用standalone=yes
,标记声明不会被忽略,而是会导致文档成为无效的 XML。你介意我把它编辑成答案吗?
@sleske 请进行更改。如果作者不开心,他/她可以随时回复。
@Stephan:感谢您的鼓励。不幸的是,我不再了解整个 XML 内容,所以我现在不能自信地编辑。如果您有最新的知识,请随意编辑自己:-)。【参考方案4】:
standalone 指令是 XML 声明的可选属性。
有效值为yes
和no
,其中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
【讨论】:
使用 Standalone="yes" 会导致额外的有效性约束(即可能导致 XML 文档无效)。我将其编辑为答案,希望没关系。 @sleske 感谢您的贡献。我试图简化您的编辑,同时仍清楚地说明您的观点。如果我弄错了,请随时再次编辑。【参考方案5】:standalone=yes
声明的目的是保证仅基于内部 DTD 可以忠实地检索文档中的信息,即文档可以“独立”而没有外部引用。验证独立文档可确保非验证处理器拥有所有可用于正确解析文档的信息。
如果文档没有外部 DTD,并且内部 DTD 没有参数实体引用,则独立声明不起作用,因为这些文档已经隐式独立。
以下是使用standalone=yes
的实际效果。
如果文档包含对未在内部 DTD 中声明的实体的引用(参数实体的替换文本除外),则强制处理器在解析具有外部 DTD 或参数实体引用的文档时抛出错误验证处理器不需要解析它); amp
、lt
、gt
、apos
和 quot
是唯一的例外
在解析未声明为独立的文档时,非验证处理器可以在遇到参数实体引用时立即停止解析内部 DTD。将文档声明为独立的会强制非验证处理器解析内部 DTD 中的标记声明,即使它们忽略了一个或多个参数实体引用。
如果在文档中发现以下任何内容,并且它们各自的声明位于外部 DTD 或参数实体替换文本中,则强制验证处理器抛出错误:
具有默认值的属性,如果它们没有明确提供其值 实体引用(amp
、lt
、gt
、apos
和 quot
除外)
具有标记化类型的属性,如果属性的值将被规范化修改
具有元素内容的元素,如果其内容中出现任何空格
非验证处理器可能会考虑检索外部 DTD 并扩展非独立文档的所有参数实体引用,即使它没有义务这样做,即设置 standalone=yes
理论上可以提高非独立文档的性能验证处理器(剧透警告:它可能不会有所作为)。
这里的其他答案要么不完整要么不正确,主要的误解是
独立声明是告诉解析器忽略 DTD 中的任何标记声明的一种方式。此后,DTD 仅用于验证。
standalone="yes" 意味着 XML 处理器必须仅使用 DTD 进行验证。
恰恰相反,将文档声明为独立文档实际上会强制非验证处理器解析它通常必须忽略的内部声明(即那些在被忽略的参数实体引用之后的声明)。非验证处理器仍必须使用内部 DTD 中的信息来提供默认属性值并规范化标记化属性,因为这与验证无关。
【讨论】:
最佳答案以上是关于XML 中的“独立”指令是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章