2016-04-14 2 views
1

のC#を使用してXMLファイルを保存します。私はこのXMLをしたユニバーサルアプリ

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

私はあなたが形式で "hh:mm:ss" の時間を置くことができるテキストボックスました(TBAngieを)。どうやら<Angie>ノード値が更新ウェルた

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(); 
    } 
} 

(私はデバッグモードで更新されたノードを参照)、しかし: このテキストボックスにフォーカスが失われたとき、私は同じXMLファイルに新しい値を保存したいですページをリフレッシュ(現在のページを終了してリロード)すると、値は更新されませんでした。だから、新しいxmlを保存する私の方法は良くないと思うが、なぜか分からない...

私は間違っていた?前もって感謝します。

EDIT私は.toString()を作ったと、私はこれをしただけでloadedData.Save()

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

少なくとも1つの行があることを確認してください。 – jdweng

+0

Saveを呼び出す前に 'loadedData.ToString()'を出力します。そこには何が見えますか? –

+0

@Nox Noctis、私は編集しました。 ... –

答えて

1

アプリのインストールディレクトリは、読み取り専用の場所です。ファイルの内容を変更する必要がある場合は、Windows.Storage.ApplicationData.Current.LocalFolderにコピーしてください。だから、あなたのアプリがファイルを読み込んだときには、からファイルがない場合は、先にLocalFolderの場所を試してみてください。

詳細はthis articleを参照してください。

+0

私はこれを試してみましょう;)ありがとう –

1

Wouaouhhhは、多くの検索設定後としてみてください、私は解決策をしました:

これは私のreadメソッドである(私が知ってみ使用する正しい方法ではない/キャッチ/最後に...)):

 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. 
      } 
     } 

そして、これは私の書き込み方式です:

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(); 
         } 
        } 

そして、私は私のXMLを更新する/読む/書くことができます。助けてくれてありがとう。私はあなたの答えを有効にするNox Noctis :)

+0

私は10 uwpに勝つことはまだ分かりませんが、8.1のストアプロジェクトでは、ファイルが存在するかどうかを確認する他の方法はありません。それを開いてFileNotFountExceptionをキャッチします。 –

+0

私はまだw10のためのより良い作品を見つけませんでした...おそらく、より良い更新があるでしょう:) –

+0

System.IO.File.Exists(パス)はuwpで動作するはずです。 例:if(System.IO.File.Exists(Path.Combine(ApplicationData.Current.LocalFolder、GirlsTimes.xml)) { // TODO:ファイルが存在します } – Akos