【问题标题】:Why does this XML file load slowly?为什么这个 XML 文件加载缓慢?
【发布时间】:2011-08-05 04:03:35
【问题描述】:

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

        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 文件,加载需要两分钟。为什么需要这么长时间?我尝试了从网上获取和文件并加载本地文件。

【问题讨论】:

  • 呃,你的文件链接是维基百科上关于“热牛奶蛋糕”的文章
  • 您可能想再次检查该网址,很确定 C# 的 XML 库不会加载热牛奶蛋糕。
  • 这有什么问题? HTML 源代码是有效的 XML。
  • 热牛奶蛋糕+1,还有一个有趣的问题。
  • 热牛奶蛋糕未通过w3schools.com/xml/xml_validator.asp 上的 XML 验证器测试。可以说 .Net 根本不需要加载它。

标签: c# xml performance xhtml


【解决方案1】:

我想是the DTD of the page 需要很长时间才能加载。鉴于它定义了实体,你不应该disable it,所以你最好不要走这条路。

鉴于 wikipedia 解析器的内部工作原理(一团糟),我认为假设它每次都会生成格式良好的 XHTML,这是一个巨大的飞跃。

使用HTML Agility Pack to parse(如果需要,您可以更轻松地转换为XmlDocument,IIRC)。

如果您真的想走XmlDocument 路线,您可以保留 HTML DTD 的本地缓存。详见this postthis postthis post

【讨论】:

  • +1,抢我答案;如果您下载副本并删除它会立即解析的 DTD,但随后会失败,因为 ®仅在 DTD 中定义。
  • W3C 会限制其 DTD 文件的流量,因为它们会被请求淹没。您可以使用自定义实体解析器来加载 DTD 文件的本地副本。
【解决方案2】:

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

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 秒来获取。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-14
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    • 2015-03-31
    相关资源
    最近更新 更多