为什么这个XML文件加载速度慢?

4

我有一些非常简单的代码:

        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;

我正在处理这个文件,它需要两分钟才能加载完成。为什么会这么慢呢?我尝试了从网络上获取文件和加载本地文件两种方式。

你提供的文件链接是一个“热牛奶蛋糕”的维基百科文章。 - Daniel DiPaolo
3
你可能希望再次检查那个网址,我非常确定 C# 的 XML 库不会加载热牛奶蛋糕。 - Juliet
3
有什么问题吗?HTML源代码是有效的XML。 - John
1
+1 对于热牛奶蛋糕,还有一个有趣的问题。 - Mike
热牛奶蛋糕在http://www.w3schools.com/xml/xml_validator.asp上未通过XML验证器测试。有人可以争论说,.Net根本不必加载它。 - seva titov
2个回答

9
我想这可能是页面的DTD导致加载时间过长。考虑到它定义了实体,您不应该禁用它,所以最好不要走这条路。
考虑到维基百科解析器的内部工作方式(一团糟),我认为假设它每次都会产生格式良好的XHTML是一个很大的飞跃。
使用HTML Agility Pack进行解析(然后如果需要,您可以更轻松地将其转换为XmlDocument,如果我没记错的话)。
如果您真的想使用 XmlDocument,可以保留 HTML DTD 的本地缓存。有关详细信息,请参见 this postthis postthis post

+1,你比我先回答了;如果你下载一份副本并删除DTD,它会立即解析,但随后失败,因为®仅在DTD中定义。 - meklarian
3
W3C 减缓其 DTD 文件的流量,因为这些文件经常被请求而导致过载。您可以使用自定义实体解析器来加载本地副本的 DTD 文件。 - Mads Hansen

5

之所以这样是因为XmlDocument不仅将您的Xml加载到一个漂亮的类层次结构中,它还会获取文档中定义的所有命名空间DTD。运行fiddler,您将看到调用以获取DTD。

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秒就可以获取到。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接