阅读大量xml的最佳方法

时间:2014-05-29 21:33:22

标签: c# xml

读取大量xml文件的最佳方法是什么(我需要阅读8000 xml)并对它们进行一些计算,并且速度最快?是否可以使用xmlreader并返回列表中我感兴趣的节点?或者在读取节点时是否更快,还要对其进行一些计算?我尝试了第二种方法(返回列表中的节点,作为值,因为我尝试用尽可能多的模块编写我的应用程序)。我正在使用C#,但这不相关。

谢谢。

2 个答案:

答案 0 :(得分:2)

  

使用xmlreader并返回我对列表中感兴趣的节点是否可以?或者在读取节点时是否更快,还要对其进行一些计算?

我无法说明返回列表是否合适,因为我不知道每个文件的大小,这在这方面比XML文档的数量更重要。

但是,如果XML文档以及生成的列表非常大,它肯定可能非常昂贵。

相反,阅读节点并随时计算肯定会更快开始产生结果,并且使用更少的内存,因此更快的程度可以忽略不计,以至于其他方法不可行,具体取决于如何这个源数据很大。如果我对性能有强烈的关注,或者是怀疑这么大的数据集的充分理由,那么我采取的方法。

两者之间的某个方面是IEnumerable<T>实现的方法,它在读取时产生对象,如下所示:

public IEnumerable<SomeObject> ExtractFromXml(XmlReader rdr)
{
  using(rdr)
    while(rdr.Read())
      if(rdr.NodeType == XmlNodeType.Element && rdr.LocalName = "thatElementYouReallyCareAbout")
      {
         var current = /*Code to create a SomeObject from the XML goes here */
         yield return current;
      }
}

与生成列表一样,这会将执行计算的代码与解析XML的代码分开,但是因为您可以在完成解析之前使用foreach开始枚举,所以内存使用可以是更少,开始计算的时间也是如此。这对于小文档来说几乎没有什么区别,但是如果它们很大的话会很多。

答案 1 :(得分:1)

我个人提出的处理XML文件的最佳解决方案是利用.Net的XmlSerializer类。您可以为xml定义一个模型,然后创建一个该模型的List,然后保存xml数据:

using (StreamWriter sw = new StreamWriter("OutPutPath")) { 

            new XmlSerializer(typeof(List<Model>)).Serialize(sw, Models);
            sw.WriteLine();

}

您可以读取文件并对数据进行去除,然后通过调用Deserialize方法将它们分配回模型。