题
我有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");
不隶属于 StackOverflow