我想在使用C#的文件夹中搜索所有XML文件(假设200+)中的元素值。
我的方案是每个文件将包含多个项目标签。所以我必须检查用户选择的SearchValue的所有项目标签。例如:ABC123
目前我正在使用foreach循环并且需要很长时间。
你能否建议我更快地获得结果
以下是我目前的代码实现。
string[] arrFiles = Directory.GetFiles(temFolder, "*.xml");
foreach (string file in arrFiles)
{
XmlDocument doc = new XmlDocument();
doc.Load(file);
XmlNodeList lstEquip = doc.SelectNodes("scene/PackedUnit/Items/ItemCode");
foreach (XmlNode xnEquip in lstEquip)
{
if (xnEquip.InnerText.ToUpper() == equipCode.ToUpper())
{
String[] strings = file.Split('\\');
string fileName = strings[strings.Count() - 1];
fileName = fileName.Replace(".xml", "");
lstSubContainers.Add(fileName);
break;
}
}
}
答案 0 :(得分:2)
嗯,首先要解决的是为什么这需要很长时间。您还没有提供任何代码,因此很难说明发生了什么。
一种选择是使用一个任务池来并行化操作,每个任务池一次处理单个文档。在理想的世界中,您可能会从单个线程上的文件中读取(以防止颠簸)并在读取文件时将文件提供给池 - 但只需读取多个线程,它可能是一个很好的起点。使用.NET 4的Parallel Extensions库可以使这一点变得相当简单。
我个人喜欢用于查询的LINQ to XML API,而不是使用“旧的”XmlElement
等API,但这取决于你。我不希望它会产生太大的影响。使用XmlReader
代替可以更快,避免创建尽可能多的垃圾 - 但我会先尝试找出“简单”代码中的时间。 (我个人认为XmlReader
比“内存中的整个文档”API更难正确使用。)
答案 1 :(得分:1)
如果你正在进行前向阅读而不是操纵Xml,那么切换到XmlReader会加快处理速度,虽然我无法想象它会真正产生巨大的差异(也许是你有文件大小的第二或两个。
我最近不得不在Silverlight(一个测试应用程序)中使用LINQ-to-XML解析一个250mb的XML文件,这需要几秒钟的时间。你的机器是什么?