2010-07-23 13 views
1

Je veux lire un fichier de données XML et en extraire des informations pour afficher dans un formulaire dans un environnement C# .Net vs2008 env. Je ne peux pas lire ces données dans une liste en mémoire, mais je veux avoir un fichier .exe du projet qui peut fonctionner dans un autre système informatique. Donc je pense, je ne peux pas utiliser la base de données pour enregistrer et récupérer des données! S'il vous plaît aidez-moi à résoudre mon problème!Lire grand fichier XML et extraire ses données dans une application de formulaire dans le projet C# .Net

+0

Je ne sais pas, je comprends votre question. Mais voici comment je l'ai lu: Vous voulez extraire des données d'un grand fichier xml et vous ne pouvez pas charger le fichier entier en mémoire. Correct? –

+1

Veuillez reformuler la question sous une forme plus compréhensible. –

+0

Vous ne savez pas pourquoi vous voulez avoir un fichier .exe séparé pour faire le travail quand vous pourriez avoir un projet auquel vous accédez via WCF qui fait le travail sur le serveur ... La solution semble beaucoup plus facile. – shookdiesel

Répondre

0

Récemment, Microsoft a fourni une classe de synidcation dans WCF. vous pouvez l'utiliser pour effectuer cette tâche

3

Utilisez System.Xml.XmlReader pour lire le fichier XML. C'est un lecteur uniquement en aval qui ne charge qu'un peu de XML à la fois.

Combinez cela avec une méthode iterator qui produit un IEnumerable, comme cet exemple, où MyXmlData est une classe qui représente ce qui se tient dans le fichier XML et une classe que vos formulaires peuvent travailler avec:

public IEnumerable<MyXmlData> QueryFile(String xmlFile) 
{ 
    using (var reader = XmlReader.Create(xmlFile)) 
    { 
     // These are the variables you want to read for each 'object' in the 
     // xml file. 
     var prop1 = String.Empty; 
     var prop2 = 0; 
     var prop3 = DateTime.Today; 

     while (reader.Read()) 
     { 
      // Here you'll have to read an xml node at a time. 
      // As you read, assign appropriate values to the variables 
      // declared above. 

      if (/* Have we finished reading an item? */) 
      { 
       // Once you've completed reading xml representing a single 
       // MyXmlData object, return it using yield return. 
       yield return new MyXmlData(prop1, prop2, prop3); 
      } 
     } 
    } 
} 

La valeur renvoyée par cette méthode est une séquence d'objets MyXmlData où chacun sera créé à la demande lors de la lecture du fichier, un à la fois. Cela réduira considérablement les besoins en mémoire pour un fichier XML volumineux.

Vous pouvez ensuite interroger vos objets MyXmlData à l'aide des fonctions Linq. Par exemple, vous pouvez émuler la pagination en utilisant les méthodes Take et Skip.

// Third page - 50 objects per page. 
QueryFile(@"x.xml").Skip(100).Take(50); 
+0

+1. C'est une excellente stratégie pour de nombreux types de fichiers, y compris .CSV. J'ai une version modifiée de ce modèle où je crée une classe proxy privée appelée "MyXmlDataWithProgress" qui hérite de MyXmlData et inclut une propriété "Progress". Pour tirer parti de cela, vous devrez ouvrir le fichier en tant que FileStream et transmettre ce flux à la méthode XmlReader.Create(). Ensuite, vous pouvez écrire quelque chose comme "rendement retour nouveau MyXmlDataWithProgress (prop1, prop2, prop3, stream.Position/stream.Length)" –

0

Vous devriez regarder dans VTD-XML, il est l'analyseur XML le plus efficace en termes d'utilisation de la mémoire sans perdre l'accès aléatoire et XPath ..

http://vtd-xml.sf.net

Questions connexes