多种XML文件搜索的简便方法

时间:2010-09-14 11:55:09

标签: c# xml

我想在使用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;
                    }
                }
            }

2 个答案:

答案 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文件,这需要几秒钟的时间。你的机器是什么?