2009-12-03 6 views
0

Je veux faire un projet dans lequel plus d'un fichier XML sera traité à la fois. Dans ce projet, j'ai essayé de mettre des fichiers XML dans un tableau et puis j'ai utilisé, mais toujours des erreurs.Mon code est comme ça:fichiers xml avec C#

string[] files = { "ilk.xml", "migr.xml", "caa.xml" }; 
    public Form1() 
    { 
     InitializeComponent(); 

     System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(@"c:\markets\"); 
     count = dir.GetFiles("*.xml").Length; 

     for (int d = 0; d < count; d++) 
     { 

      XmlDocument xmlDoc1 = new XmlDocument(); 

      xmlDoc1.Load(files[d]); 

      xmldocument= new XmlDocument(); 

      xmldocument.Load(@"C:\\markets\files[d]"); 

// ici je compare les valeurs des fichiers xml

     } 

l'erreur est "Impossible de trouver le fichier « C: \ marchés \ fichiers [d]". Tous les xml Les fichiers sont dans le répertoire des marchés. Quand j'ai écrit le nom du fichier sans utiliser de tableau, il n'y a pas de problème. Pouvez-vous m'aider?

Répondre

0

Vous pouvez utiliser le chargement asynchrone et le multi-threading si vous voulez vraiment les charger "à la fois" (comme dans, parallèlement en même temps). Probablement si vous voulez juste avoir tous les documents XML analysés et chargés en même temps en fonction de votre commentaire que vous allez les comparer. Que diriez-vous d'utiliser un tableau d'objets XmlDocument pour faire correspondre le tableau d'entrée des noms de fichiers? C'est le moyen le plus simple de les charger tous. Vous pouvez également utiliser une collection si vous avez besoin d'être dynamique. Ce code permet également d'obtenir tous les fichiers avec l'extension ".xml" dans le répertoire. Cela semble être quelque chose que vous essayez de faire avec le nombre, mais ensuite vous référencez le tableau de nom de fichier défini de manière statique. Cela entraînerait une erreur si le nombre de fichiers XML dans ce répertoire dépassait les noms de fichier dans votre tableau.

Si vous voulez juste utiliser un ensemble fixe de noms, vous pouvez le faire:

public void CompareMyXMLFiles() 
{ 
    string[] files = { "ilk.xml", "migr.xml", "caa.xml" }; 
    CompareXML(@"c:\markets", files); 
} 

public void CompareXML(string basePath, string[] xmlFileNames) 
{ 
    XmlDocument[] xmlDocuments = new XmlDocument[xmlFileNames.Length]; 
    for(int i = 0; i < xmlFileNames.Length; i++) 
    { 
     xmlDocuments[i] = new XmlDocument(); 
     xmlDocuments[i].Load(basePath + @"\" + xmlFileNames[i]); 
    } 

    //...do compare work here 
} 
+0

Merci beaucoup pour votre aide le programme fonctionne maintenant –

+0

Je ne comprends pas le vote vers le bas ... pour la réponse qui a été acceptée et travaillée. Quelqu'un peut-il expliquer cela s'il vous plaît? –

+0

@Kevin Brock - La réponse était un simple guillemet mal placé. Votre soultion ne fonctionne que parce qu'elle a réécrit la ligne problématique. – MiffTheFox

10

Vous placez la référence du tableau dans la chaîne elle-même au lieu de la concaténer.

xmldocument.Load(@"C:\markets\" + files[d]); 
-1

Vous mentionnez le traitement de plusieurs fichiers à la fois.

Le code ci-dessus n'atteindra pas cela, vous voudrez regarder dans le thread pour faire cela; vous devrez déplacer le traitement des fichiers dans une fonction distincte, puis créer une instance de ThreadStart et Thread pour activer votre travail. Vous aurez alors besoin d'une certaine logique pour la liste des répertoires et des fichiers à partir desquels il lit afin d'appeler la fonction dans un thread distinct en fonction du nombre de processus simultanés que vous voulez exécuter.

+0

Vous pouvez obtenir un traitement de asyn sans avoir recours à beaucoup de discussions supplémentaires. En utilisant XmlReader/Writer, vous pouvez gérer de manière asynchrone tous les fichiers sans créer vous-même un seul nouveau thread. Oui, vous devez les coordonner, mais cela en vaut la peine. –

+0

Je crois par "plusieurs fichiers à la fois" l'OP fait référence au traitement de plusieurs fichiers contrairement au traitement d'un seul fichier, mais pas à la concurrence. (Je suis en train de présumer du code source original.) – JMD