Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XML尽可能高效地查找特定元素_C#_.net_Xml_File Io_Linq To Xml - Fatal编程技术网

C# XML尽可能高效地查找特定元素

C# XML尽可能高效地查找特定元素,c#,.net,xml,file-io,linq-to-xml,C#,.net,Xml,File Io,Linq To Xml,我正在开发一个应用程序,在这个应用程序中,我必须从几个大(3meg'ish)文件中读取一个特定的xml节点(“progress”节点) 我是通过TextReader和XDocument实现的,如下所示 TextReader reader = null; reader = new StreamReader(Filename); XDocument objDoc = XDocument.Load(reader); var progressElement = objDoc.Root.Element(

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

我是通过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秒(这里的无线性很差)。

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

  • 整个文档不需要读入内存模型。(DOM)
  • 当你得到你想要的东西时,你可以停止处理

  • 看一看

    如果你只想提高速度,那么XmlReader是你最好的选择。它一次读取一个节点,从一开始就开始。最大的限制是你不能回溯或使用任何对XML文档的随机访问。

    XmlReader会这样做吗?没有人喜欢XMLAPI,但它是streamin而不是DOM。我试图避免这种解决方案,但它看起来似乎是唯一的选择。我现在正在键入一些示例,甚至在网络文件上调用“new StreamReader”都需要1.5秒。我想无论我使用xdocument还是xmlreader,时间惩罚都会存在xdocument不是瓶颈。