【问题标题】:Easy way of Multiple XML file search多个 XML 文件搜索的简单方法
【发布时间】:2013-02-27 05:35:50
【问题描述】:

我想使用 C# 在一个文件夹中的所有 XML 文件(假设 200+)中搜索一个元素值。

我的方案是每个文件将包含多个项目标签。所以我必须检查用户选择的搜索值的所有项目标签。例如: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;
                    }
                }
            }

【问题讨论】:

  • 发送一个 XML 的 sn-p,我应该能够为您指出一两个解决方案。还有什么是“项目标签”?
  • 文件大小在 100 Kb 到 1 MB 之间

标签: c# xml


【解决方案1】:

嗯,首先要解决的是为什么需要很长时间。你没有提供任何代码,所以很难说发生了什么。

一个选项是并行化操作,使用一个任务池,每个任务一次处理一个文档。在理想情况下,您可能会在单个线程上读取文件(以防止颠簸)并在读取文件时将文件提供给池 - 但只是在多个线程中读取它可能是一个很好的起点。使用 .NET 4 的 Parallel Extensions 库会使这变得相当简单。

我个人喜欢使用 LINQ to XML API 进行查询,而不是使用“旧”XmlElement 等 API,但这取决于您。我不希望它有太大的不同。使用 XmlReader 代替 可能 更快,避免产生尽可能多的垃圾 - 但我会尝试首先在“简单”代码中找出时间在哪里。 (我个人觉得XmlReader 比“内存中的整个文档”API 更难正确使用。)

【讨论】:

    【解决方案2】:

    如果您只进行正向阅读而不以任何方式操作 Xml,则切换到 XmlReader 应该会加快处理速度,尽管我无法想象它真的会产生巨大的影响(也许一秒钟或最多两个)与您拥有的文件大小。

    我最近不得不在 Silverlight(一个测试应用程序)中使用 LINQ-to-XML 解析一个 250mb 的 XML 文件,这需要几秒钟才能完成。你的机器是什么?

    【讨论】:

      猜你喜欢
      • 2013-07-10
      • 2011-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多