我有xml文档模板,我需要加载入如下.例如:

myXMLDocument.Load(myXMLFile);

然而,这是非常缓慢,因为它载在dtd。我已经试过 "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" 和一个当地复制的dtd。两者都或多或少相同的时间。如果我把装载dtd通过设置解决null(例如),然后我得到错误,例如 "Reference to undeclared entity 'nbsp'" 如果该文件载有这些。

我需要使用如下,因为我需要操作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文件的在线引用,这些可能会减慢这个过程。您也可以尝试对其中的一些进行评论,其中一些但不是全部都标记为“必需”。在评论中。

这是缓慢的,因为它正在从网络上下载的。为了解决这个问题,做到以下几点:

  • 下载*.国防部和*。ent文件所引用的DTD(你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");
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top