1

Windows 8 で VS 2012 Express を使用しています。XML ファイルをロードし、その内容を変更してからディスクに保存したいと考えています。

これまで、LINQ to XML を使用してきましたが、ファイルを読み込んで、いくつかのノード情報を変更することができました。

XDocument.Save(string) メソッドを使用してファイルをディスクに保存したいのですが、オンライン ドキュメントに記載されていますが、インテリセンスにはそのメソッドが含まれていません。

理由はありますか?

ありがとう

- -アップデート - -

これが私がやろうとしていることです

string questionsXMLPath;
XDocument xmlDocQuestions = null;
StorageFile file = null;

public MainPage()
{
    this.InitializeComponent();

    questionsXMLPath = Path.Combine(Package.Current.InstalledLocation.Path, "Assets/Template.xml");
    xmlDocQuestions = XDocument.Load(questionsXMLPath);
}

private async void SomeCodeHereToPopulateControls()
{
    // This Code populates the controls on the Window to edit the XML nodes.
}


private async void Button_Click_3(object sender, RoutedEventArgs e)
{
    XElement eleQuestion =
        (from el in xmlDocQuestions.Descendants("Question")
        where (string)el.Element("ID") == txtID.Text
        select el).FirstOrDefault();

    eleQuestion.Elements("Description").FirstOrDefault().ReplaceWith(txtDescription.Text);

    xmlDocQuestions.Save(questionsXMLPath);  // ERROR HERE AND CAN'T COMPILE
}
4

2 に答える 2

0

Jim O'Neil のアドバイスのおかげで、MSDN のドキュメントを読み、アプリケーションのフォルダーの Asset サブフォルダーが読み取り専用であることを最終的に理解しました。私はユーザーの AppData ディレクトリを使用しましたが、LINQ to XML を使用して XML ドキュメントを読み込んで保存するために、文字列の代わりにストリームを使用して、最終的に実装した同等のソリューションを次に示します。

private async void cmdSaveQuestion_Click(object sender, RoutedEventArgs e)
    {
        using (Stream questions = await ApplicationData.Current.LocalFolder.OpenStreamForWriteAsync(@"Template.xml", CreationCollisionOption.OpenIfExists))
        {
            questions.Position = 0;
            xmlDocTemplate = XDocument.Load(questions);

            XElement eleQuestion =
                (from el in xmlDocTemplate.Descendants("Question")
                 where (string)el.Element("ID") == txtID.Text
                 select el).FirstOrDefault();

            eleQuestion.Elements("Description").First().Value = txtDescription.Text;
            eleQuestion.Elements("Active").First().Value = chkActive.IsChecked.ToString();
            questions.Seek(0, SeekOrigin.Begin);

            xmlDocTemplate.Save(questions);
            questions.SetLength(questions.Position);
        }

        LoadTemplateFromXmlFile();
    }

また、ストリーム内のカーソル位置を管理する必要がありました。そうしないと、カーソルの位置に応じて、データが 2 回書き込まれるか、ファイルの途中に書き込まれます。

ジム、または誰でも、コードをさらに最適化できるかどうかコメントを歓迎します。

于 2013-05-25T17:30:50.187 に答える
0

Windows.Storage APIを使用する必要があります。Windows 8 のサンドボックス化された非同期の世界では、ファイル ストレージの処理に 2 つの大きな違いがあります。

  1. アプリケーションは、そのアプリケーションの「ローカル ストレージ」からのみプログラムでデータにアクセスできますが、エンド ユーザーがファイル システムの他の場所から保存/読み取りするための特定のアクセス許可をアプリに付与していない限り (ファイル ピッカーとフォルダー ピッカーを使用)

  2. ファイルの読み取りと書き込みは非同期操作であるため、ほとんどのファイル アクセス メソッドは "Async" で終わります。(通常) async/await パターンを使用してそれらを活用します。

詳細については、Windows デベロッパー センターの「Windows ストア アプリでのファイル アクセスとアクセス許可」のトピックと、ファイル アクセスのサンプルを参照してください。

特定のケースでは、記事に示されている手法と上記のコード サンプルを使用して、必要な出力ファイルにXDocument.ToString()を書き込むことになります。

ところで、ファイル システム (および Windows ストア プログラミングに固有のその他の概念) について学習するための、より包括的で測定されたアプローチについては、(無料の) Microsoft App Builder プログラムを利用することをお勧めします。

于 2013-05-21T15:02:25.700 に答える