【问题标题】:XML Seek to specific elements, as efficiently as possibleXML 尽可能高效地查找特定元素
【发布时间】:2013-11-22 16:20:24
【问题描述】:

我正在开发一个应用程序,我必须从几个大 (3meg'ish) 文件中读取特定的 xml 节点(“进度”节点)。

我是通过TextReader和XDocument来做的,如下图

TextReader reader = null;
reader = new StreamReader(Filename);
XDocument objDoc = XDocument.Load(reader);

var progressElement = objDoc.Root.Element("Progress");           

var lastAccessTime = progressElement.Element("LastTimeAccessed").Value;
var user = progressElement.Element(("LastUserAccessed").Value;
var lastOpCode = progressElement.Element("LastOpCodeCompleted").Value;
var step = progressElement.Element("StepsCompleted").Value;

我相信,XDocument 是在执行任何其他操作之前将整个文件加载到内存中。不过,我不需要那个!我知道该节点将成为文件中的第一个节点。

是否有任何类型的'seek' xml 解析器不首先缓存整个文件?

为上述属性解析 10 个文件大约需要 15 秒(这里的无线很糟糕)。

【问题讨论】:

  • XmlReader 可以吗? “没人喜欢 xml” API,但它是流式传输而不是 DOM。
  • 我试图避免这种解决方案,但它开始看起来像是唯一的选择。

标签: c# .net xml file-io linq-to-xml


【解决方案1】:

如果您只想要速度,XmlReader 是您的最佳选择。它一次读取一个节点,从头开始。最大的限制是您不能返回或使用任何随机访问 XML 文档。

【讨论】:

  • 我现在正在输入一些示例,甚至在网络文件上调用“新 StreamReader”也需要 1.5 秒。我认为无论我使用 xdocument 还是 xmlreader 都会有时间损失,我认为 xdocument 不是瓶颈。
【解决方案2】:

是的。您可以使用与 XDocument 不同的 SAX 解析器。基本上,SAX 解析器通过输入 XML 工作,在回调代码中触发事件。 (您编写这些回调处理程序。)主要优点;

  1. 不需要将整个文档读入内存模型。 (一个 DOM)
  2. 您可以在需要时停止处理。

看看http://www.ibm.com/developerworks/library/x-tipsaxstop/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-12
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    相关资源
    最近更新 更多