读取大量xml's的最佳方式

本文关键字:最佳 方式 xml 读取 | 更新日期: 2023-09-27 18:05:53

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

谢谢。

读取大量xml's的最佳方式

是否可以使用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开始枚举,因此内存使用可以减少,开始计算的时间也会减少。这对小文档影响不大,但对大文档影响很大

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

using (StreamWriter sw = new StreamWriter("OutPutPath")) { 
            new XmlSerializer(typeof(List<Model>)).Serialize(sw, Models);
            sw.WriteLine();
}

您可以读取文件并对数据进行反序列化,然后通过调用Deserialize方法将它们分配给模型。