none
Comment extraire les valeurs d'un fichier .xml dans Windows Store App? RRS feed

  • Question

  • Hello everybody!
    Je souhaire lire les valeurs contenues dans un fichier .xml.

    J'ai réussi à le faire dans une "console App":

    public static NeedList ReadXML_Need()
            {
                string sAttr = ConfigurationManager.AppSettings.Get("cheminFichierXML");
                string name = ConfigurationManager.AppSettings.Get("nomFichierXML_Need");
    
                //Serialisation de la structure XSD
                XmlSerializer x = new XmlSerializer(typeof(NeedList));
    
                //Lecture du fichier en entrée
                TextReader reader = new StreamReader(sAttr + name);
    
                return (NeedList)x.Deserialize(reader);
            }

    Puis j'ai utilisé ReadXML_Need dans main et les valeurs sont alors affichées dans la console.

    Comme je souhaite faire de même avec Windows Store (Windows 8), je n'y arrive plus (d'abord, ConfigurationManager inconnu, je l'ai supprimé puis StreamReader est inconnu de Windows Store (après quelques recherches, il est impossible de l'utiliser dans une Windows Store application).

    Quelle est le code alternatif pour récupérer les valeurs d'un fichier .xml statique?
    F2O
    mardi 26 mars 2013 14:32

Réponses

  • J'ai trouvé une solution mais XDocument n'est pas utilisé.

    J'ai alors écrit une partie de code (et je ne sais pas vraiment si c'est correct mais cela semble bien marcher):

    public async Task<List<Need>> ReadXML_Need()
    {            
      
    // Recupération du fichier    
     StorageFolder localFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
    StorageFolder dataFolder = await localFolder.GetFolderAsync("XML Files");
    StorageFile newFile = await dataFolder.GetFileAsync("Need.xml");
             
    List<Need> Need_L= new List<Need>();
     
    //Deserialization        
    using (Stream stream = await newFile.OpenStreamForReadAsync())
    {
       DataContractSerializer ser = new DataContractSerializer(typeof(List<Need>));
       Need_L = (List<Need>)ser.ReadObject(stream);
                
             }
    
             return Need_L;
    
    }
    

    F2O

    • Marqué comme réponse Aurel Bera lundi 1 avril 2013 07:37
    vendredi 29 mars 2013 09:36
  • doc.Element("TagRacine").Attribute("code").Value par exemple

    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    • Proposé comme réponse Richard ClarkMVP mardi 2 avril 2013 15:07
    • Marqué comme réponse F2O mercredi 3 avril 2013 11:49
    mardi 2 avril 2013 09:50

Toutes les réponses

  • Avec XDocument ?

    var file = await ApplicationData.Current.LocalFolder.GetFileAsync("Fiches.xml");
    var stream = await file.OpenReadAsync();
    var reader = new StreamReader(stream.AsStreamForRead());
    var content = await reader.ReadToEndAsync();
    
    var doc = XDocument.Parse(content);
    // lecture des données
    // ........
    reader.Dispose();
    stream.Dispose();


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    mercredi 27 mars 2013 07:55
  • Qu'est ce que cela signifie XDocument?

    Et je ne vois pas du tout comment récupérer les données....

    De plus, une question vient s'ajouter: est ce que c'est possible de désérialiser les fichiers xml avec les classes contenant des tableaux?

    Si ce n'est pas suffisamment clair ou détaillé, n'hésitez pas à me demander plus d'infos.
    • Modifié F2O mercredi 27 mars 2013 11:09
    mercredi 27 mars 2013 11:07
  • Un XDocument est une classe qui permet de lire le contenu d'un fichier Xml (c'est dans System.Linq.Xml).

    Reportez vous à sa documentation : http://msdn.microsoft.com/fr-fr/library/system.xml.linq.xdocument.aspx

    Maintenant, vous parlez de sérialiseur. Dans WinRT, vous avez des sérialiseurs fournis en standard (DataContract), mais les performances ne sont pas top. Le plus performant est de créer votre propre sérialiseur, basé sur un BinaryWriter.


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    mercredi 27 mars 2013 11:15
  • Bonjour,

    Est-ce que vous avez testé les solutions proposées ? Merci de partager avec nous les résultats, afin que d'autres personnes avec le même problème puissent profiter de cette solution.

    Cordialement

    Aurel BERA, Microsoft
    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    jeudi 28 mars 2013 10:55
  • J'ai trouvé une solution mais XDocument n'est pas utilisé.

    J'ai alors écrit une partie de code (et je ne sais pas vraiment si c'est correct mais cela semble bien marcher):

    public async Task<List<Need>> ReadXML_Need()
    {            
      
    // Recupération du fichier    
     StorageFolder localFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
    StorageFolder dataFolder = await localFolder.GetFolderAsync("XML Files");
    StorageFile newFile = await dataFolder.GetFileAsync("Need.xml");
             
    List<Need> Need_L= new List<Need>();
     
    //Deserialization        
    using (Stream stream = await newFile.OpenStreamForReadAsync())
    {
       DataContractSerializer ser = new DataContractSerializer(typeof(List<Need>));
       Need_L = (List<Need>)ser.ReadObject(stream);
                
             }
    
             return Need_L;
    
    }
    

    F2O

    • Marqué comme réponse Aurel Bera lundi 1 avril 2013 07:37
    vendredi 29 mars 2013 09:36
  • Ca c'est de la sérialisation/désérialisation avec DataContractSerializer.

    Donc ca sérialise effectivement dans un fichier Xml. D'ailleurs, "officiellement", le DataContractSerializer est le sérialiseur conseillé par MS pour sauvegarder/lire ses données.

    MAIS :

    1. C'est pas vraiment une flèche (perf)
    2. Le format Xml prend de la place (100Ko max pour son RoamingStorage)

    Donc perso, je préfère faire mon propre format de fichier en utilisant un BinaryWriter/BinaryReader. Ca demande plus de boulot, mais bcp plus performant.

    En revanche, le titre de votre post spécifiait : comment lire un fichier Xml. Donc pour lire/écrire un fichier Xml, je vous conseille de vous familiariser avec la classe Xdocument et toutes celles qui vont avec.

    Bon courage.


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    vendredi 29 mars 2013 09:41
  • Je suis en train d'essayer votre méthode. 

    La méthode précédente que j'ai utilisé, j'ai réussi à lire les valeurs dans Need_L mais je n'ai pas réussi à récupérer ces valeurs dans l'application. C'est-à-dire que les données contenues dans le fichier xml doivent être affichées dans l'application.

    Et les données ne seront pas dans roaming, mais dans local (car les données seront les mêmes pour tous les utilisateurs qui ne pourront pas les modifier)

    Si j'utilise XDocument, je pourrais faire afficher les données?  Et je ne vois pas comment lire les données...

    Voici la classe de l'objet Need par exemple:

    public class Need
        {
            private string codeField;
            private string labelField;
    
            public string code { get { return this.codeField; } set { this.codeField = value; } }
            public string label { get { return this.labelField; } set { this.labelField = value; } }
    
            public Need() { }
    
            public Need(string code, string label)
            {
                this.codeField = code;
                this.labelField = label;
            }
        }

    Puis je crée une liste List<Need> et une méthode :

            public static async Task<List<Need>> ReadXML_Need()
            {
                StorageFolder localFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
                StorageFolder dataFolder = await localFolder.GetFolderAsync("XML Files");
                StorageFile newFile = await dataFolder.GetFileAsync("Need.xml");
    
                var stream = await newFile.OpenReadAsync();
                var reader = new StreamReader(stream.AsStreamForRead());
                var content = await reader.ReadToEndAsync();
    
                var doc = XDocument.Parse(content);
    
                List<Need> Need_List = .... ;
    
                return Need_List;
            }

    Je ne vois pas comment procéder à la lecture (je veux lire les deux attributs code et label).

    Cdt,

    F2O


    mardi 2 avril 2013 09:46
  • doc.Element("TagRacine").Attribute("code").Value par exemple

    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    • Proposé comme réponse Richard ClarkMVP mardi 2 avril 2013 15:07
    • Marqué comme réponse F2O mercredi 3 avril 2013 11:49
    mardi 2 avril 2013 09:50
  • Merci beaucoup,

    Après avoir suivi vos conseils, j'ai enfin réussi à faire afficher les données.

    Cdt,

    F2O

    mardi 2 avril 2013 14:52