2016-04-14 4 views
1

Ich habe diese Xml:eine XML-Datei mit C# in Universal-App speichern

<?xml version="1.0" encoding="utf-8" ?> 
<GirlsTimes> 
    <Angie>00:00:00</Angie> 
    ... 
    <Nicole>00:00:00</Nicole> 
</GirlsTimes> 

ich eine Textbox haben, wenn Sie eine Zeit im Format setzen können "hh: mm: ss" (TBAngie). Wenn der Fokus auf diesem Feld verloren wurde, mag ich den neuen Wert in derselben XML-Datei speichern:

private async void TBAngie_LostFocus(object sender, RoutedEventArgs e) 
{ 
    try 
    { 
     if (!checkContent(TBAngie.Text)) 
     { 
      TBAngie.Text = string.Empty; 
      var dialog = new MessageDialog("Veuillez encodez un temps hh:mm:ss svp."); 
      await dialog.ShowAsync(); 
     } 
     else 
     { 
      StringBuilder sb = new StringBuilder(); 
      XmlWriterSettings xws = new XmlWriterSettings(); 
      xws.OmitXmlDeclaration = true; 
      xws.Indent = true; 

      using (XmlWriter xw = XmlWriter.Create(sb, xws)) 
      { 
       string repMaxXMLPath = Path.Combine(Package.Current.InstalledLocation.Path, "XML/GirlsTimes.xml"); 
       loadedData = XDocument.Load(repMaxXMLPath); 
       var items = from item in loadedData.Descendants("GirlsTimes") 
          where item.Element("Angie").Value != TBAngie.Text 
          select item; 

       foreach (XElement itemElement in items) 
       { 
        itemElement.SetElementValue("Angie", TBAngie.Text); 
       } 

       loadedData.Save(xw); 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     var dialog = new MessageDialog(ex.Message); 
     await dialog.ShowAsync(); 
    } 
} 

Anscheinend ist der <Angie> Knotenwert gut war Update (I die aktualisierten Knoten im Debug-Modus zu sehen), aber Wenn ich die Seite aktualisiere (beende die aktuelle Seite und lade sie neu), wird der Wert nicht aktualisiert. Also ich denke, meine Methode, die neue XML zu speichern, war nicht gut, aber ich weiß nicht warum ...

Was habe ich falsch gemacht? Danke im Voraus.

EDIT

Kurz vor loadedData.Save() ich einen .toString gemacht haben() und ich habe dies:

<GirlsTimes> 
    <Angie>00:12:34</Angie> 
    ... 
    <Nicole>00:00:00</Nicole> 
</GirlsTimes> 
+0

Stellen Sie sicher, dass Elemente mindestens eine Zeile hat. – jdweng

+0

Drucken Sie die Datei 'loadedData.ToString()', bevor Sie Speichern aufrufen. Was siehst du dort? –

+0

@Nox Noctis, ich habe eine Bearbeitung vorgenommen. Das XML wurde gut aktualisiert ... –

Antwort

1

Das Verzeichnis ist nur für Lese eine Installation von App-Lage. Wenn Sie den Dateiinhalt ändern müssen, kopieren Sie ihn in Windows.Storage.ApplicationData.Current.LocalFolder. Wenn Ihre App die Datei lädt, versuchen Sie es zuerst unter LocalFolder. Wenn keine Datei vorhanden ist, lesen Sie sie unter InstalledLocation.

Weitere Informationen finden Sie unter this article.

+0

Ich werde das versuchen;) Danke –

1

Wouaouhhh nach vielen searchs und versuchen, ich die Lösung habe:

Das ist meine Lesemethode (ich weiß, ist nicht der richtige Weg versuchen zu verwenden/catch/finally ...)):

 private async void GetGirlsTimes() 
     { 
      StorageFolder localFolder = ApplicationData.Current.LocalFolder; 
      try 
      { 
       StorageFile textFile = await localFolder.GetFileAsync("GirlsTimes.xml"); 
       using (IRandomAccessStream textStream = await textFile.OpenReadAsync()) 
       { 
        Stream s = textStream.AsStreamForRead(); 
        loadedData = XDocument.Load(s); 
       } 
      } 
      catch 
      { 
       storageFolder = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFolderAsync("AppData"); 
       storageFile = await storageFolder.GetFileAsync("GirlsTimes.xml"); 
       using (IRandomAccessStream writeStream = await storageFile.OpenAsync(FileAccessMode.Read)) 
       { 
        Stream s = writeStream.AsStreamForRead(); 
        loadedData = XDocument.Load(s); 
       } 
      } 
      finally 
      { 
       ...//put the value from loadedData to my differents TextBoxes. 
      } 
     } 

Und das ist meine Write-Methode:

var items = from item in loadedData.Descendants("GirlsTimes") 
           where item.Element("Angie").Name == "Angie" 
           select item; 

        foreach (XElement itemElement in items) 
        { 
         itemElement.SetElementValue("Angie", TBAngie.Text); 
        } 

        StorageFolder localFolder = ApplicationData.Current.LocalFolder; 
        StorageFile textFile = await localFolder.CreateFileAsync("GirlsTimes.xml", CreationCollisionOption.ReplaceExisting); 
        using (IRandomAccessStream textStream = await textFile.OpenAsync(FileAccessMode.ReadWrite)) 
        { 
         using (DataWriter textWriter = new DataWriter(textStream)) 
         { 
          textWriter.WriteString(loadedData.ToString()); 
          await textWriter.StoreAsync(); 
         } 
        } 

Und dann kann ich schreiben/lesen/meine Xml aktualisieren. Danke für die Hilfe. I Gültig Ihre Antwort Nox Noctis :)

+0

Ich weiß nicht über win 10 uwp noch, aber in 8.1 speichern Projekte gibt es keine andere Möglichkeit zu prüfen, ob eine Datei existiert, außer zu versuchen öffne es und fange die FileNotFountException. –

+0

Ich habe noch nichts besseres für w10 arbeiten ... vielleicht mit dem Update wird es besser :) –

+0

System.IO.File.Exists (Pfad) sollte in uwp funktionieren. Zum Beispiel: if (System.IO.File.Exists (Path.Combine (ApplicationData.Current.LocalFolder, GirlsTimes.xml)) { // TODO: Die Datei existiert } – Akos