【问题标题】:Handle public external DTDs in .Net via XmlResolver通过 XmlResolver 处理 .Net 中的公共外部 DTD
【发布时间】:2010-02-16 05:03:31
【问题描述】:

我的 XML 引用了这样的 DTD:

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。这将导致使用以下 URI 调用 GetEntity:“file:///absolut/path/to.xml/-//OWNER//NAME//modules.ent”。显然,现在重构路径的内涵变得很奇怪。

任何提示如何以正确的方式实现它?我认为公共外部 DTD 在出版业中很常见,所以必须有一个干净的解决方案!?

干杯, 阿奇姆

【问题讨论】:

    标签: c# .net xml dtd


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-02-05
      • 1970-01-01
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      • 2014-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多