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

XmlDocument和缓慢的模式处理

  •  5
  • Sprintstar  · 技术社区  · 17 年前

    myXMLDocument.Load(myXMLFile);
    

    然而,这是非常缓慢的,因为它加载在dtd中。我两者都试过了 "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" "Reference to undeclared entity 'nbsp'" 如果文档包含这些。

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

    5 回复  |  直到 17 年前
        1
  •  3
  •   Sprintstar    17 年前

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

    这将速度从11.5秒左右提高到160毫秒,目前可能已经足够好了。如果它仍然不够快,我将执行克里斯的解决方案。:)

        2
  •  2
  •   bvssvni    15 年前

    如果返回空内存流,则可以避免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();
       }
    }
    
        3
  •  0
  •   schnaader    17 年前

        4
  •  0
  •   ChrisW    17 年前

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

    • 下载DTD引用的*.mod和*.ent文件(XmlResolver实例将告诉您正在查找的URI的名称)
        5
  •  -1
  •   Wolfwyrd    17 年前

    您是否尝试过创建一个对任何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");