XML尽可能高效地寻找特定元素

时间:2013-11-22 16:20:25

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

我正在开发一个应用程序,我必须读取一个特定的xml节点('progress'节点,来自几个大的(3meg'ish)文件。

我是通过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秒钟(这里有可怕的无线)。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

  1. 不需要将整个文档读入内存模型。 (一个DOM)
  2. 当你有你想要的东西时,你可以停止处理。
  3. 查看http://www.ibm.com/developerworks/library/x-tipsaxstop/