代码之家  ›  专栏  ›  技术社区  ›  Josh

doctype解析和asp.net的问题

  •  2
  • Josh  · 技术社区  · 15 年前

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

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

    <!DOCTYPE ElementName SYSTEM "ElementName.dtd">
    

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

    找不到文件“C:\Program Files\Microsoft Visual” 导播室 9.0\common7\ide\elementname.dtd'

    为什么要在那里寻找DTD?

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

    2 回复  |  直到 8 年前
        1
  •  3
  •   Martin Brown    15 年前

    不幸的是,生成XML的库使用了DTD的相对URL,而不是完全限定的URL。因此,xmlcontrol的xmldocument使用 XmlResolver 类将相对路径转换为完全限定路径。默认情况下,它使用 XmlUrlResolver (这是一个具体的XML解析器)。这将尝试将DTD的位置映射到它认为与XML文档相关的位置。问题是,XML文档在哪里?可能是在内存中,它不是与任何内容相关的,而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并调用在XMLReader中传递的LOAD,最后调用。
    4. 将xmlcontrol的xmldocument属性设置为xmldocument。

    坦率地说,这一切都有点麻烦,所以如果我在这里使用string.replace,在将文档处理为XML之前,从文档中删除DTD声明。

    如果你真的感到勇敢,你可以创建一个直接从xmlsolver继承的解析器。完成后,可以覆盖 GetEntity 方法,然后您可以从任意位置获取DTD文档。我曾经写过一篇文章,从嵌入的文件中获取DTD作为资源文件,但不幸的是,我已经没有代码了:-(

        2
  •  0
  •   Martin    15 年前

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