XmlDocument和慢模式处理

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

myXMLDocument.Load(myXMLFile); 

然而,这在dtd中加载时非常慢。 我已经尝试了"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"和dtd的本地副本。 两者都或多或少地同时进行。 如果我通过将解析器设置为null(例如)来加载dtd,那么如果文档包含这些错误,则会出现诸如"Reference to undeclared entity 'nbsp'"错误"Reference to undeclared entity 'nbsp'"

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

如果返回空的内存流,则可以避免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(); } } 

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

这将速度从大约11.5秒增加到160毫秒,这可能已经足够了。 如果它仍然不够快,我将恭维ChrisW的解决方案。 🙂

查看DTD文件,还有一些对.mod文件的在线引用,也许这些会减慢进程。 您也可以尝试对其中的一些进行评论,其中一些但不是全部都在评论中标记为“必需”。

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

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

您是否尝试过创建一个虚拟解析器,它为任何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");