我对各种 DOM 节点类型如何与 DTD 配合感到困惑。
好的,所以W3C DOM规范将XML/HTML组件分类为节点(我们大多数人通过Javascript编程或XML解析熟悉)。
节点类型包括:
Document
DocumentFragment
DocumentType
EntityReference
Element
Attr
ProcessingInstruction
Comment
Text
CDATASection
Entity
Notation
这里让我感到困惑的是Entity
节点的想法。
我了解Entity
节点是什么 - 它基本上让你定义一个"实体",以后可以使用&;
语法引用并扩展。 这有点像在 XML 中使用变量的一种方式。
好的,但真正让我感到困惑的是,据我了解,!ENTITY
节点通常只能出现在 DTD(文档类型定义)中。 但 DTD 实际上是一种与 XML 完全独立的格式,具有完全独立的节点类型,如!ELEMENT
节点、!ATTLIST
节点和!ENTITY
节点。 DTD 可以使用无处不在的 !DOCTYPE
声明嵌入到 XML 文档中,但我的问题是:
为什么 W3C DOM 规范中专门!ENTITY
节点指定了节点类型,而其他 DTD 节点类型则没有? 为什么我们在 W3C DOM 模型中看不到!ELEMENT
节点和!ATTLIST
节点? 为什么只有!ENTITY
节点作为节点类型包含在内? !ENTITY
节点是否可以以某种方式出现在 DTD 之外、XML 文档中?
Entity
和EntityReference
接口不在Web上使用,并且至少在某些(如果不是全部)Web浏览器中未实现。DOM 规范不仅限于 Web,因此这些对象可以出现在 DOM 的非浏览器实现中。
Entity
对象确实表示自定义<!ENTITY ...>
声明,可以通过DocumentType::entities
获取。我想Entity
是Node
的子类,因为实体可以扩展到节点树。
EntityReference
s 可以代替实体引用 (&ent;
) 出现在 DOM 树中。仅当 XML/HTML 解析器在实体保留模式下运行时,才会发生这种情况。解析器还将在EntityReference
的子树中提供实体扩展。
.NET Framework 文档中的"将实体声明和实体引用读入 DOM "和下一节"保留实体引用"对此进行了更详细的说明。