【问题标题】:Problems with DOCTYPE resolution and ASP.NetDOCTYPE 解析和 ASP.Net 的问题
【发布时间】:2016-01-28 01:02:50
【问题描述】:

previous question 中,我提到了与第 3 方 DLL 的一些工作,其接口使用一系列使用 DTD 定义的 XML 输入。到目前为止一切都很顺利,但是在解决生成的输入值中的文档类型声明时,我仍然遇到这个烦人的问题。

我无法弄清楚决定在哪里查找引用的 DTD 文件的决定因素是什么。如果我有一个如下所示的声明:

<!DOCTYPE ElementName SYSTEM "ElementName.dtd">

我最初的想法是应用程序的当前执行路径是解析器查找 DTD 的地方。但是,当我尝试在 ASP.Net 中使用 XML control 时,我得到的错误让我感到困惑......

找不到文件'c:\Program Files\Microsoft Visual 工作室 9.0\Common7\IDE\ElementName.dtd'

为什么要在那里寻找 DTD?

有没有任何 XML 专家可以帮助我解决这个问题。我真的无法控制从这个 DLL 返回的 XML,所以我应该怎么做。有没有办法向操作系统“注册”一个 DTD?喜欢 GAC?

【问题讨论】:

    标签: asp.net .net xml doctype


    【解决方案1】:

    不幸的是,生成 XML 的库使用 dtd 的相对 url 而不是完全限定的。因此,XmlControl 的 XmlDocument 使用XmlResolver 类将相对路径转换为完全限定的路径。默认情况下,它使用XmlUrlResolver(即具体的 XmlResolver)。这将尝试将 dtd 的位置映射到它认为与 Xml 文档相关的位置。问题是,XmlDocument 在哪里?可能在与任何东西都不相关的内存中,并且 XmlUrlResolver 正在使用进程位置,而不是在您的情况下是位于“c:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\devenv.exe”的 Visual Studio。

    那你能做什么?好吧,我想您必须创建自己的 XmlResolver 继承自 XmlUrlResolver 并覆盖 ResolveUri 方法并执行适当的操作。完成后,您将必须:

    1. 创建一个 XmlReaderSettings 类并将 XmlReolver 属性设置为您刚刚创建的类。
    2. 使用传入您的文档和 XmlSettings 对象的 XmlReader.Create() 创建一个 XmlReader。
    3. 创建一个 XmlDocument 并调用 Load,最后传入 XmlReader。
    4. 将 XmlControl 的 XmlDocument 属性设置为 XmlDocument。

    坦率地说,这有点痛苦,所以如果它在我那里我会使用 string.Replace 从文档中删除 DTD 声明,然后再将其处理为 XML。

    如果您真的很勇敢,您可以创建一个直接从 XmlResolver 继承的解析器。完成此操作后,您可以覆盖 GetEntity 方法,然后您可以从任何您喜欢的地方获取 dtd 文档。我曾经写过一个从作为资源文件嵌入的文件中获取 dtds,但不幸的是,我不再有代码了 :-(

    【讨论】:

    • 哇!我只能想象你之前必须经历过所有这些痛苦,才能就这个问题提供如此详细的建议。是的,我对 Visual Studio 的了解也很多,因为我正在运行 Cassini,并且对部署到服务器后需要 dtd 的位置感到紧张。 IIS?
    • (续)结果是,是的,我确实必须将 dtd 转储到 IIS 执行路径中,但这是一个巨大的集群 F!然而,我非常感谢这个建议,因为它可以让这个项目更易于维护:)
    • 这是我经过数小时搜索后在任何地方找到的最佳答案,如果我能多次投票给你 Martin 我会...
    【解决方案2】:

    如果您实际上并不关心根据其 DTD 验证每个文档,则可以在 XmlTextReader(或 XmlDocument)上将 XmlResolver 属性设置为 null 以完全忽略 DTD。

    【讨论】:

      猜你喜欢
      • 2011-05-23
      • 2012-11-26
      • 1970-01-01
      • 2011-05-29
      • 2015-12-29
      • 2013-04-24
      • 2015-08-03
      • 2010-10-14
      • 1970-01-01
      相关资源
      最近更新 更多