Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
DOCTYPE解析和ASP.Net的问题_Asp.net_.net_Xml_Doctype - Fatal编程技术网

DOCTYPE解析和ASP.Net的问题

DOCTYPE解析和ASP.Net的问题,asp.net,.net,xml,doctype,Asp.net,.net,Xml,Doctype,在一篇文章中,我提到了一些使用第三方DLL的工作,该DLL的接口使用一系列使用DTD定义的XML输入。到目前为止,一切都进行得很顺利,但在解决生成的输入值中的文档类型声明时,我仍然存在这个棘手的问题 我不明白的是,在确定在哪里查找引用的DTD文件时,决定因素是什么。如果我有这样的声明: <!DOCTYPE ElementName SYSTEM "ElementName.dtd"> 我最初的想法是,应用程序的当前执行路径是解析器查找DTD的地方。然而,当我尝试在ASP.Net中使

在一篇文章中,我提到了一些使用第三方DLL的工作,该DLL的接口使用一系列使用DTD定义的XML输入。到目前为止,一切都进行得很顺利,但在解决生成的输入值中的文档类型声明时,我仍然存在这个棘手的问题

我不明白的是,在确定在哪里查找引用的DTD文件时,决定因素是什么。如果我有这样的声明:

<!DOCTYPE ElementName SYSTEM "ElementName.dtd">

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

找不到文件“c:\Program Files\Microsoft Visual” 演播室 9.0\Common7\IDE\ElementName.dtd'

为什么要在那里寻找DTD


有没有XML专家可以在这方面帮助我。我真的不能控制从这个DLL返回的XML,所以我应该怎么做呢。有没有办法在操作系统中“注册”DTD?与GAC一样?

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

那你能做什么呢?好吧,我想您必须包装您自己的XmlResolver,该XmlResolver继承自XmlUrlResolver,重写ResolveUri方法并执行适当的操作。完成后,您必须:

  • 创建一个XmlReaderSettings类,并将XmlReolver属性设置为刚创建的类
  • 使用XmlReader.Create()创建XmlReader,并传入文档和XmlSettings对象
  • 创建一个XmlDocument并调用Load传入XmlReader,最后调用Load
  • 将XmlControl的XmlDocument属性设置为XmlDocument
  • 坦率地说,这有点痛苦,因此,如果在将其处理为XML之前,我只需要使用string.Replace从文档中删除DTD声明


    如果您感到非常勇敢,您可以创建一个直接从XmlResolver继承的解析器。完成后,可以重写该方法,然后可以从任何您喜欢的地方获取dtd文档。我曾经写过一篇文章,从作为资源文件嵌入的文件中获取DTD,但不幸的是,我已经没有代码了:-(

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

    哇!我只能想象你以前一定经历过一次这样的痛苦,才能够就这个问题提供如此详细的建议。是的,我对visual studio的事情也有同样的想法,因为我在运行Cassini,并且对一旦将DTD部署到服务器上,我会在哪里需要感到紧张。IIS?(续)结果是,是的,我确实必须在IIS执行路径中转储dtd,但这是一个巨大的群集F!我非常感谢这个建议,因为它将使该项目更易于维护:)这是我在搜索数小时后在任何地方找到的最佳答案,如果我能多次投票给你,我会。。。