DOCTYPE解析和ASP.Net的问题
在一篇文章中,我提到了一些使用第三方DLL的工作,该DLL的接口使用一系列使用DTD定义的XML输入。到目前为止,一切都进行得很顺利,但在解决生成的输入值中的文档类型声明时,我仍然存在这个棘手的问题 我不明白的是,在确定在哪里查找引用的DTD文件时,决定因素是什么。如果我有这样的声明: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中使
<!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方法并执行适当的操作。完成后,您必须:
如果您感到非常勇敢,您可以创建一个直接从XmlResolver继承的解析器。完成后,可以重写该方法,然后可以从任何您喜欢的地方获取dtd文档。我曾经写过一篇文章,从作为资源文件嵌入的文件中获取DTD,但不幸的是,我已经没有代码了:-(如果您实际上不关心根据DTD验证每个文档,那么可以在XmlTextReader(或XmlDocument)上将XmlResolver属性设置为null完全忽略DTD。哇!我只能想象你以前一定经历过一次这样的痛苦,才能够就这个问题提供如此详细的建议。是的,我对visual studio的事情也有同样的想法,因为我在运行Cassini,并且对一旦将DTD部署到服务器上,我会在哪里需要感到紧张。IIS?(续)结果是,是的,我确实必须在IIS执行路径中转储dtd,但这是一个巨大的群集F!我非常感谢这个建议,因为它将使该项目更易于维护:)这是我在搜索数小时后在任何地方找到的最佳答案,如果我能多次投票给你,我会。。。