我正在研究一种检查格式良好的XML解析器。根据{{3}},为了获取实体引用和属性列表定义(即为了解决目的而创建符号表),需要 process dtd这样的“xml处理器”。引用,规范化属性值和提供默认属性值)。如果我知道应用程序本身将输出XML,这是否意味着将整个DTD传递给应用程序?
如果没有,那么在完全处理的XML文档中保存DTD的标准最佳做法是什么?我的直觉是要么不传递DTD和一个说standalone=no
的XML声明,要么传递一个剥离的DTD,除了它的名称和文档中实际引用的外部实体的声明之外,它已被剥离。 / p>
答案 0 :(得分:1)
不,处理外部DTD不一定要求将DTD的全部内容合并到输出中。除其他外,输出并不总是与输入相同的文档...
但是,这确实意味着您必须决定如何处理实体引用和默认属性值。一种方法(a)只是扩展它们并将其内容传递给输出文档。另一种方法是确保输出文件(b)至少包括其内部DTD中这些信息的声明,或者(c)引用提供这些定义的外部DTD(可能与源文件所做的相同,如果输出文档的类型与该DTD兼容)。
选项(a),扩展所有内容,使您不再依赖于默认值和宏的DTD,实际上是通用XML处理的最常用解决方案。如果您的工具使用一组特定的DTD,则选项(c)将是一个合适的答案。
请注意,类似的答案适用于XML Schema。还要注意DTD,因为它们与XML命名空间不兼容,所以它们已经不复存在;命名空间对于严肃的XML处理来说太有用了。所有现代XML解析器都应该支持Schema;如果您绝对要求与最早的XML代码具有向后兼容性,那么我现在推荐使用DTD。 (DTD做的那一个模式不是Parsed Entities ......但实际上,除了手工构建的文档之外,很少使用它们。)
数字字符引用或少数名为字符引用(&和最显着)内置于XML语言和解析器中,因此您不需要DTD处理来支持这些。
.....
顺便说一下:为什么你要从头开始重写XML解析器?除非你专门研究解析器优化或类似的东西,或者将它作为类赋值进行研究,否则没有理由不使用众多现成的解析器之一;在这一点上,我认为它们存在于几乎所有广泛可用的编程语言中,并且它们可能会在优化和处理XML的微妙之处方面投入更多的工作,而不是你已经或将要。
如果你真的需要重新发明这个特定的轮子,我 HIGHLY 建议花一些时间The Annotated XML Specification。 Tim Bray做了一个 WONDERFUL 工作,完成了XML 1.0 REC并准确解释了它的含义以及为什么一些不那么明显的决策是以他们的方式完成的。不幸的是,这需要足够的努力 - 以及对工作组讨论的足够内部知识 - 没有人愿意为XML 1.1或任何其他W3C规范重做它。