通过XmlResolver处理.Net中的公共外部DTD

时间:2010-02-15 14:49:40

标签: c# .net xml dtd

我的XML引用了这样的DTD:

< !DOCTYPE文章PUBLIC“ - //所有者//姓名// EN”“http://invalid/path/to.dtd”>

DTD不能通过给定的URL获得,但我可以将其下载到我的光盘。我试图实现自定义XmlResolver来加载DTD,但它不起作用。我的自定义XmlResolver实现了GetEntity,通过调试器我可以看到以下调用:

  1. 请求的uri是要加载的xml文档。我打开这个文档的流并返回它。这很好。
  2. 请求DTD作为格式为“file:///absolut/path/to.xml/-//OWNER//NAME//EN”的URI。我正在使用正则表达式检查 - //。*?//哪个工作正常,但对我来说看起来不太干净。但如果DTD是自包含的,它就可以工作。
  3. DTD引用modules.ent。这导致调用GetEntity的URI为:“file:///absolut/path/to.xml/-//OWNER//NAME//modules.ent”。显然现在重建路径的内涵是非常奇怪的。
  4. 任何提示如何以正确的方式实现它?我认为公共外部DTD在出版业很常见,所以必须有一个干净的解决方案!?

    欢呼声, Achim的

1 个答案:

答案 0 :(得分:1)

"file:///absolut/path/to.xml/-//OWNER//NAME//EN"是SYSTEM和PUBLIC标识符的串联。通常,您希望查看其中一个,而不是两个,当然不是单个字符串。当您说“请求DTD作为格式的URI”时,不清楚谁在进行请求。似乎调用代码连接SYSTEM和PUBLIC。

如果您将DTD作为磁盘文件,并且您需要做的就是将一个URI映射到另一个URI,则可以覆盖ResolveUri()而不是完整的GetEntity()。如果您的资源无法作为简单的URI访问,则GetEntity()会更有用,例如你在运行时计算资源的内容,你从数据库中获取它,你使用非标准的URL方案和协议,如svn:等。