在一个前一个问题我提到的一些工作与第三方DLL,其接口采用了一系列使用的DTD定义的XML输入。一切都已经顺利到目前为止,但我仍然有这个唠叨问题与生成的输入值解析文档类型声明。

我想不出是决定因素是决定在何处寻找引用DTD文件的内容。如果我有一个声明,看起来像这样:

<!DOCTYPE ElementName SYSTEM "ElementName.dtd">

我最初的想法是,应用程序的当前执行路径是一个解析器会查找DTD。然而,当我尝试使用href="http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.xml.aspx" rel="nofollow noreferrer"> XML控制的在ASP.Net,我得到的错误令我感到困惑......

  

找不到文件“C:\ Program Files文件\微软的Visual   工作室   9.0 \ Common7 \ IDE \ ElementName.dtd'

为什么要找的DTD呢?

是否有任何XML大师在那里谁可以帮我在这一个。我真的没有过。这就是DLL所以我到底做返回的XML任何控制。有没有一种方法来“登记”与操作系统DTD?像GAC

有帮助吗?

解决方案

不幸的是生成该XML库中使用的相对URL的DTD,而不是一个完全合格的一个。这样的XmlControl的XmlDocument的是使用的XmlResolver 类的相对路径转换为一个完全合格的。默认情况下,它使用的是 XmlUrlResolver (这是一个具体的XmlResolver)。这将尝试将DTD的位置映射到它认为是相对于XML文档的位置。麻烦的是,这里是XmlDocument的?大概在内存里面是不是相对于任何与XmlUrlResolver使用过程中位置,而不是对于您来说是的Visual Studio它位于“C:\ Program Files文件\微软的Visual Studio 9.0 \ Common7 \ IDE \ devenv.exe的”。

所以,你能做什么呢?好吧,我想你必须箱子你自己的XmlResolver从XmlUrlResolver继承一个覆盖ResolveUri方法和做适当的事。做完,你将不得不为:

  1. 创建一个XmlReaderSettings类和设置XmlReolver属性刚刚创建的类。
  2. 创建使用XmlReader.Create()传递文档中一个XmlReader和XmlSettings对象。
  3. 创建一个XmlDocument和呼叫负载传入的XmlReader,最后。
  4. 设置你的XmlControl到的XmlDocument的XmlDocument的属性。
  5. 坦率地说这是所有有点痛的,所以如果它在那里我我只想用处理与string.replace成XML之前删除文档中的DTD的声明。

    如果你感觉真的很勇敢,你可以创建直接的XmlResolver继承解析器。一旦你这样做,你可以重写 GetEntity 方法,然后你可以从任何你喜欢的DTD文档。我写了一个一旦接到嵌入的资源文件文件的DTD,但不幸的是,我没有任何代码更多: - (

其他提示

如果你不真正关心反对它的DTD验证每一个文件,你可以设置你的XmlTextReader的(或XmlDocument的)的的XmlResolver属性设置为null,以完全忽略DTD。

scroll top