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