如果 XML 声明和 DTD 都是 XML 文档有效性和格式良好的先决条件,那么它们如何在规范中都是可选的?
Posted
技术标签:
【中文标题】如果 XML 声明和 DTD 都是 XML 文档有效性和格式良好的先决条件,那么它们如何在规范中都是可选的?【英文标题】:How can both XML declaration and DTD be optional in the spec if they are both prerequisites to validity and well-formedness of an XML document? 【发布时间】:2022-01-04 04:24:58 【问题描述】:仔细阅读the latest XML 1.0 specification,一个XML文档定义如下:
[1] document ::= prolog element Misc*
...
[22] prolog ::= XMLDecl? Misc* (doctypedecl Misc*)?
[23] XMLDecl ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>'
...
[28] doctypedecl ::= '<!DOCTYPE' S Name (S ExternalID)? S? ('[' intSubset ']' S?)? '>'
规范指出
[Definition:如果 XML 文档具有关联的 document type declaration 并且该文档符合其中表达的约束条件,则该 XML 文档是有效。]
并且格式良好如果“它满足本规范中给出的所有格式良好的约束。”(参见definition)。
document type declaration 的定义有两个格式约束和一个有效性约束,因此如果省略它,则 XML 文档不能被视为有效。
里面有a minimal XML document example,
<?xml version="1.0"?>
<greeting>Hello, world!</greeting>
而且我理解为什么它格式正确但无效,但它仍然没有解释如果 XML 文档需要它是有效的,DTD 如何可以是可选的。
这个问题的背景
开始阅读 XML spec 是因为想在进入 DocBook 5 之前获得更好的理解,但 it's manual 指出“DocBook V5.0 是使用称为 RELAX NG 的强大模式语言定义的 " 所以它“不再依赖于 DTD”,并且the example shown 也完全省略了 DTD。
【问题讨论】:
【参考方案1】:W3C XML Recommendation 只定义了一种 XML 模式:DTD。其他存在:XSD、Relax NG 和 Schematron 是其他 XML 模式。事实上,DTD 由于其表达能力有限,很少用于定义现代 XML 模式。
有效性的概念已扩展到适用于所有 XML 模式:如果 XML 文档遵守由模式定义的语法和内容约束,则称其相对于 XML 模式有效。
可以省略 DTD,原因与 XML 文档需要的相同 不与任何 XML 模式关联:遵守规则 对于应用程序而言,格式良好通常就足够了。 可以省略 XML 声明,因为它的值是默认值 足以支持整个过程中的良构规则 建议的其余部分。另见
Is there any difference between 'valid xml' and 'well formed xml'?【讨论】:
【参考方案2】:解释如果要使 XML 文档有效,DTD 如何是可选的。
好吧,有效性是可选的,因此 DTD 是可选的。
我认为您对“有效”一词的解读过多。假设他们没有称其为“有效性”,而是称其为“可爱”。如果一个文档有一个 DTD 并且与该 DTD 中定义的规则相匹配,那么它就是可爱的。并非所有文件都很可爱;可爱是可选的,因此 DTD 是可选的。
关于您关于 DocBook 和 RelaxNG 的最后一段。 XML 规范中定义/描述的有效性是指基于 DTD 的有效性。更广泛扩展的有效性概念允许文档结构以 DTD 以外的约束语言定义,例如 XSD 或 RelaxNG。没有 Doctype/DTD 的文档在 XML 规范的狭义上是无效的,但在允许替代模式语言的广义上是有效的。
【讨论】:
"我认为您对“有效”这个词的解读太多了。" ? - 出于某种原因,我确信有效性是符合要求的绝对要求到一个规范,现在必须建立一个新的心理模型。谢谢你的“可爱”类比,它有很大帮助。以上是关于如果 XML 声明和 DTD 都是 XML 文档有效性和格式良好的先决条件,那么它们如何在规范中都是可选的?的主要内容,如果未能解决你的问题,请参考以下文章