none
Ecriture et lecture d'un fichier xml RRS feed

  • Question

  • Bonjour,

    J'essaye de sauvegarder un fichier xml téléchargé dans mon application.

    Je reçoit bien le fichier donc le problème vient soit de la sauvegarde soit de la récupération. Voici mon code :

     async protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
            {
    
                base.OnNavigatedTo(e);
    
                bool result  = await CheckIfUpdateAvailable();
                if (result)
                {
    
                    Debug.WriteLine("mise à jour du xml");
    
                    await DownloadFile("http://..........", XML_FILENAME);
                    
                }
                ShowXmlNews();
    
            }
    
            private async Task<bool> CheckIfUpdateAvailable()
            {
                HttpClient httpClient = new HttpClient();
    
                string resultKey = await httpClient.GetStringAsync("http://...........");
    
                IsolatedStorageSettings appSettings = IsolatedStorageSettings.ApplicationSettings;
                if (!appSettings.Contains("key"))
                {
                    Debug.WriteLine("fichier xml jamais récupéré");
                    appSettings.Add("key", resultKey);
                    return true;
                }
    
                string savedKey = appSettings["key"].ToString();
    
    
                if (savedKey.Equals(resultKey)){
                    Debug.WriteLine("fichier xml à jour");
                    return false ;
                }else {
    
                    Debug.WriteLine("fichier xml expiré");
                    appSettings.Add("key", resultKey);
                    return true ;
                }
    
    }
    
            public async Task DownloadFile(String url, string fileName)
            {
    
                HttpClient httpClient = new HttpClient();
                string resultXml = await httpClient.GetStringAsync(url);
    
                IsolatedStorageFile ISF = IsolatedStorageFile.GetUserStoreForApplication();
    
                StreamWriter writer = new StreamWriter(ISF.CreateFile(fileName));
                writer.Write(resultXml);
                writer.Close();
    
            }
            }
    
            private void ShowXmlNews()
            {
                IsolatedStorageFile isoStore = IsolatedStorageFile.GetUserStoreForApplication();
    
                if (isoStore.FileExists(XML_FILENAME))
                {
                    using (IsolatedStorageFileStream isoStream = isoStore.OpenFile(XML_FILENAME, FileMode.Open))
                    {
                        using (StreamReader reader = new StreamReader(isoStream))
                        {
                            Console.WriteLine(reader.ReadToEnd());
                            
                            string xlmText = reader.ReadToEnd();
                            ParseXmlFile(xlmText);
                        }
                    }
                }
            }


    Lorsque j'inspecte : 

    string xlmText = reader.ReadToEnd();

    celui-ci est vide.

    Merci de votre aide


    Florian R SAS


    • Modifié Florian R SAS mercredi 21 janvier 2015 16:04 masquage des url
    mercredi 21 janvier 2015 16:04

Réponses

  • Bonjour, Florian R SAS,

    Après le premier appel de ReadToEnd(); la position actuelle atteint la fin du flux. Le deuxième appel retourne une chaîne vide. Vous pouvez consultez l’article MSDN: StreamReader.ReadToEnd, méthode          

    Donc vous pouvez définir auparavant la variable xmlText et la passer comme paramètre de Console.WriteLine:

            using (StreamReader reader = new StreamReader(isoStream))
                {
                    string xlmText = reader.ReadToEnd();
                    Console.WriteLine(xlmText);
                    ParseXmlFile(xlmText);
                }

    Vous pouvez aussi utiliser la méthode DiscardBufferedData pour lire de nouveau:

    using (StreamReader reader = new StreamReader(isoStream)) { Console.WriteLine(reader.ReadToEnd()); reader.DiscardBufferedData(); reader.BaseStream.Seek(0, SeekOrigin.Begin); string xlmText = reader.ReadToEnd(); ParseXmlFile(xlmText); }


    Vous pouvez consultez: StreamReader.DiscardBufferedData, méthode

    Cordialement,
    Dimitar


    jeudi 22 janvier 2015 15:00
    Modérateur

Toutes les réponses

  • Bonjour, Florian R SAS,

    Après le premier appel de ReadToEnd(); la position actuelle atteint la fin du flux. Le deuxième appel retourne une chaîne vide. Vous pouvez consultez l’article MSDN: StreamReader.ReadToEnd, méthode          

    Donc vous pouvez définir auparavant la variable xmlText et la passer comme paramètre de Console.WriteLine:

            using (StreamReader reader = new StreamReader(isoStream))
                {
                    string xlmText = reader.ReadToEnd();
                    Console.WriteLine(xlmText);
                    ParseXmlFile(xlmText);
                }

    Vous pouvez aussi utiliser la méthode DiscardBufferedData pour lire de nouveau:

    using (StreamReader reader = new StreamReader(isoStream)) { Console.WriteLine(reader.ReadToEnd()); reader.DiscardBufferedData(); reader.BaseStream.Seek(0, SeekOrigin.Begin); string xlmText = reader.ReadToEnd(); ParseXmlFile(xlmText); }


    Vous pouvez consultez: StreamReader.DiscardBufferedData, méthode

    Cordialement,
    Dimitar


    jeudi 22 janvier 2015 15:00
    Modérateur
  • Oh belle erreur de ma part...

    Merci Dimitar


    Florian R SAS

    jeudi 22 janvier 2015 15:19