Xml DTD处理的最佳实践

Xml DTD处理的最佳实践,xml,dtd,Xml,Dtd,我正在开发一个XML解析器,用于检查格式是否良好。根据,需要这样一个“xml处理器”来处理dtd,以获取实体引用和属性列表定义(即,为了解析引用、规范化属性值和提供默认属性值而创建符号表)。如果我知道应用程序本身将输出XML,这是否意味着将整个DTD传递给应用程序 如果没有,在完全处理的XML文档中保存DTD的标准最佳实践是什么?我的直觉是要么不传递DTD,要么传递一个XML声明,上面写着standalone=no,要么传递一个精简的DTD,该DTD除去了文档中实际引用的外部实体的名称和声明之外

我正在开发一个XML解析器,用于检查格式是否良好。根据,需要这样一个“xml处理器”来处理dtd,以获取实体引用和属性列表定义(即,为了解析引用、规范化属性值和提供默认属性值而创建符号表)。如果我知道应用程序本身将输出XML,这是否意味着将整个DTD传递给应用程序


如果没有,在完全处理的XML文档中保存DTD的标准最佳实践是什么?我的直觉是要么不传递DTD,要么传递一个XML声明,上面写着
standalone=no
,要么传递一个精简的DTD,该DTD除去了文档中实际引用的外部实体的名称和声明之外的所有内容,处理外部DTD并不一定需要将该DTD的全部内容合并到输出中。除此之外,输出并不总是与输入相同类型的文档

但是,这确实意味着您必须决定如何处理实体引用和默认属性值。一种方法(a)是简单地展开它们并将其内容传递给输出文档。另一种方法是确保输出文档(b)在其内部DTD中至少包含这些信息的声明,或者(c)引用提供这些定义的外部DTD(如果输出文档的类型与该DTD兼容,则可能与源文档的定义相同)

选项(a)扩展所有内容,使默认值和宏不再依赖DTD,实际上是通用XML处理的最常见解决方案。如果您的工具使用的是一组特定的DTD,那么选项(c)将是一个合适的答案

注意,类似的答案也适用于XML模式。还要注意的是,DTD由于与XML名称空间不兼容,正处于消亡的边缘;名称空间对于严肃的XML处理来说太有用了。所有现代XML解析器都应该支持模式;只有在绝对需要与最早一代XML代码向后兼容的情况下,我才会推荐DTD。(DTD所做的模式所没有的一件事是解析实体……但实际上,除了手工构造的文档之外,这些实体在任何东西中都很少使用。)

数字字符引用,或少数命名字符引用(&和<最显著的)内置于XML语言和解析器中,因此不需要DTD处理来支持这些引用

顺便问一下:你为什么要从头开始重写XML解析器?除非您专门研究解析器优化或类似的东西,或者将其作为类赋值,否则没有理由不使用许多现成的解析器中的一个;在这一点上,我认为它们存在于几乎每一种广泛使用的编程语言中,它们很可能在优化和处理XML的微妙之处方面投入了比您现在或将来更多的工作


如果你真的需要重新发明这个特殊的轮子,我强烈建议你花点时间和它在一起。蒂姆·布雷(Tim Bray)出色地完成了XML 1.0 REC的检查工作,并准确地解释了这一切的意义,以及为什么一些不太明显的决定是以这种方式做出的。不幸的是,这需要足够的努力——以及对工作组讨论的足够深入的了解——以至于没有人愿意为XML 1.1或任何其他W3C规范重做它。

我本能地为应用程序提供一个最低限度完整的DTD,这是因为当传递给应用程序时,实际上不需要它们,而且非验证处理器基本上跳过了符号和元素定义。