不,处理外部DTD不一定需要将该DTD的全部内容合并到输出中。除此之外,输出并不总是与输入相同的文档...
但是,这意味着您必须决定如何处理实体引用和默认属性值。一种方法(a)仅仅是扩展它们并将其内容传递给输出文档。另一个是确保输出文档(b)至少包含其内部DTD中的这些信息的声明,或者(c)参考提供这些定义的外部DTD(可能与源文档相同,如果输出文档是与该DTD兼容的类型)。选项(a),扩展所有内容以便不再依赖于DTD的默认值和宏,实际上是用于通用XML处理的最常见解决方案。如果你的工具使用了一组特定的DTD,选项(c)将是一个合适的答案。
请注意,类似的答案适用于XML模式。还要注意,DTD因为与XML名称空间不兼容而处于被禁用的边缘;命名空间对于严肃的XML处理来说太有用了。所有现代的XML解析器都应该支持Schema;如果您绝对需要与最早一代XML代码的向后兼容性,那么现在我会推荐DTD。 (DTD所做的一个事情就是解析实体......但实际上,除了手工构建的文档之外,这些实际上极少使用。)
数字字符引用或少数几个指定的字符引用(&和最显着的<)内置于XML语言和解析器中,因此您不需要通过DTD处理来支持这些语言和解析器。
.....
顺便说一句:见鬼,为什么你重写从头XML解析器?除非你专门研究解析器优化或类似的东西,或者将它作为类的分配,否则没有理由不使用众多现成的解析器之一;在这一点上,我认为它们存在于几乎所有可用的编程语言中,并且它们可能已经为优化和处理XML的微妙问题投入了大量工作,而不是您现有或将要完成的工作。
如果你真的需要重新创造这个特定的轮子,我高度建议花费一些时间与The Annotated XML Specification。 Tim Bray做了一个经历XML 1.0 REC的工作,并准确解释了它的含义,以及为什么一些不太明显的决定是按照他们的方式进行的。不幸的是,这需要足够的努力 - 并且对工作组中的讨论有足够的内部知识 - 没有人愿意为XML 1.1或任何其他W3C规范重做它。
我本能地向应用程序提供最小完整的DTD源于这样一个事实,即由于内部实体在传递给应用程序时已经被扩展,所以实际上并不需要它们,而且事实上,不验证处理器基本上跳过符号和元素定义。 –