5

我有一个需要加载到 XmlDocument 中的 xml 模板文档。例如

myXMLDocument.Load(myXMLFile);

然而,这非常慢,因为它在 dtd 中加载。我已经尝试过"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"dtd 和本地副本。两者或多或少都需要相同的时间。如果我通过将解析器设置为 null(例如)来加载 dtd,则会收到错误消息,例如"Reference to undeclared entity 'nbsp'"文档是否包含这些错误。

我需要使用 XmlDocument,因为我需要在输出文档之前操作 DOM。我怎样才能绕过这些问题?

4

5 回答 5

3

ChrisW 的回答听起来很有趣,但是我从这个链接实现了一个缓存解析器:http: //msdn.microsoft.com/en-us/library/bb669135.aspx

这将速度从大约 11.5 秒提高到了 160 毫秒,这对于现在来说可能已经足够了。如果它仍然不够快,我将实施 ChrisW 的解决方案。:)

于 2009-01-08T13:18:19.220 回答
2

如果返回一个空的内存流,则可以避免 DTD:

private class DummyResolver : XmlResolver
{
   public override System.Net.ICredentials Credentials
   {
    set
    {
     // Do nothing.
    }
   }

public override object GetEntity(Uri absoluteUri, string role, Type ofObjectToReturn)
   {
    return new System.IO.MemoryStream();
   }
}
于 2011-05-13T13:06:56.973 回答
0

查看 DTD 文件,网上有更多 .mod 文件的参考资料,也许这些会减慢处理速度。您也可以尝试将其中一些注释掉,其中一些但并非全部在注释中标记为“必需”。

于 2009-01-08T11:20:57.350 回答
0

它很慢,因为它是从网络下载的。要解决此问题,请执行以下操作:

  • 下载 DTD 引用的 *.mod 和 *.ent 文件(您的 XmlResolver 实例将告诉您正在查找的 URI 的名称)
  • 将这些文件作为资源文件添加到您的项目中
  • 定义 XmlResolver 的子类,其 GetEntity() 方法返回从本地资源文件创建的流
于 2009-01-08T11:33:52.223 回答
-1

您是否尝试过创建一个虚拟解析器,它为任何 dtd 路径返回 null 并将其传递给 load 命令?就像是:

class DummyResolver : XmlUrlResolver 
{
    public override Uri ResolveUri (Uri baseUri, String relativeUri) 
    {
       return null;
    }
}

XmlDocument xmlDocument = new XmlDocument();
xmlDocument.XmlResolver = new DummyResolver();

xmlDocument.Load(@"whatever.xml");
于 2009-01-08T11:22:36.893 回答