2011-04-14 59 views
4

我有一些非常簡單的代碼:爲什麼這個XML文件加載速度慢?

 XmlDocument doc = new XmlDocument(); 
     Console.WriteLine("loading"); 
     doc.Load(url); 
     Console.WriteLine("loaded"); 

     XmlNodeList nodeList = doc.GetElementsByTagName("p"); 

     foreach(XmlNode node in nodeList) 
     { 
      Console.WriteLine(node.ChildNodes[0].Value); 
     } 
     return source; 

我工作this文件,它需要兩分鐘來加載。爲什麼需要這麼長時間?我試圖從網上抓取文件並加載本地文件。

+0

呃你的文件鏈接是維基百科文章的「熱牛奶蛋糕」 – 2011-04-14 00:49:18

+0

「熱牛奶蛋糕」? – Mehrdad 2011-04-14 00:49:22

+3

您可能想再次檢查該URL,很確定C#的XML庫不會加載熱牛奶蛋糕。 – Juliet 2011-04-14 00:50:19

回答

9

我想它是the DTD of the page這需要很長時間才能加載。鑑於它定義的實體,你不應該disable it,所以你最好不要走這條道路。

鑑於wikipedia解析器的內部工作原理(正確的混亂),我認爲假設它每次都會生成格式良好的XHTML是一個巨大的飛躍。

使用HTML Agility Pack to parse(如果需要,您可以更容易地轉換爲XmlDocument,IIRC)。

如果您確實想要沿着XmlDocument路線走下去,您可以保留HTML DTD的本地緩存。有關詳細信息,請參見this post,this postthis post

+0

+1,打我的答案;如果您下載一個副本並刪除它立即解析的DTD,但由於®僅在DTD中定義,因此失敗。 – meklarian 2011-04-14 01:00:08

+3

W3C將流量限制在他們的DTD文件中,因爲他們被埋在請求中。您可以使用自定義的entityresolver來加載DTD文件的本地副本。 – 2011-04-14 01:26:19

+0

刪除DTD對我有用! – yonexbat 2015-09-18 08:34:00

5

這是因爲XmlDocument不會將您的Xml加載到一個漂亮的類中,它也會去獲取文檔中定義的所有名稱空間DTD。運行fiddler,你會看到來電來獲取

http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd 
http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent 
http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent 
http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent 

這些都花了大約20秒取。