2010-09-14 4 views
0

Je veux rechercher une valeur d'élément dans tous les fichiers XML (supposons 200+) dans un dossier en utilisant C#.Un moyen facile de recherche de fichiers XML multiples

Mon scénario est que chaque fichier contiendra des étiquettes d'éléments multiples. Je dois donc vérifier toutes les balises d'élément pour User Selected SearchValue. Par exemple: ABC123

Actuellement, j'utilise la boucle foreach et cela prend beaucoup de temps.

Pourriez-vous s'il vous plaît me suggérer une meilleure option pour obtenir un résultat beaucoup plus rapide

est ma mise en œuvre À la suite actuelle de code.

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

Envoyez un extrait du code XML et je devrais pouvoir vous diriger vers une ou deux solutions. Aussi, qu'est-ce qu'un "item tag"? – Aliostad

+0

Quelle est la taille de chaque fichier XML? –

+0

Taille de fichier entre 100 Kb à 1 Mo – srinivas

Répondre

2

Eh bien, la première chose à travailler est pourquoi cela prend beaucoup de temps. Vous n'avez fourni aucun code, il est donc difficile de dire ce qui se passe.

Une option consiste à paralléliser l'opération, en utilisant un pool de tâches travaillant chacune sur un seul document à la fois. Dans un monde idéal, vous devriez probablement lire les fichiers sur un seul thread (pour éviter le débordement) et fournir les fichiers au pool au fur et à mesure que vous les lisez - mais lire simplement plusieurs threads est probablement un bon point de départ. L'utilisation des bibliothèques d'extensions parallèles de .NET 4 rendrait cela raisonnablement simple.

Personnellement, j'aime l'API LINQ to XML pour l'interrogation, plutôt que d'utiliser l'ancienne API XmlElement, mais c'est à vous de décider. Je ne m'attendrais pas à ce que cela fasse une grande différence. En utilisant XmlReader au lieu de , pourrait être plus rapide, en évitant de créer autant d'ordures - mais j'essaierais de trouver d'abord où le temps passe dans le code «simple». (Personnellement, je trouve XmlReader plutôt difficile à utiliser correctement que l'API « document entier dans la mémoire ».)

1

Si vous faites avant uniquement la lecture et non manipuler le Xml en tout cas, le passage à un XmlReader devrait accélérer le traitement, bien que je ne puisse pas imaginer qu'il fera vraiment une énorme différence (peut-être une seconde ou deux au maximum) avec les tailles de fichiers que vous avez.

J'ai récemment dû analyser un fichier XML de 250 Mo en utilisant LINQ-to-XML dans Silverlight (une application de test) et cela a pris quelques secondes à faire. Quelle est votre machine?

Questions connexes