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

您需要使用Windows.Storage API。在 Windows 8 的沙盒和异步世界中,您会发现处理文件存储的两个显着差异:

  1. 应用程序只能以编程方式从该应用程序的“本地存储”访问数据,除非最终用户已授予应用程序特定权限以从文件系统的其他位置存储/读取(通过文件和文件夹选择器

  2. 读取和写入文件是一种异步操作,因此您会发现大多数以“异步”结尾的文件访问方法,并且您将(通常)使用async/await 模式来利用它们

查看 Windows 开发中心上的 Windows 应用商店应用程序中的文件访问和权限主题,了解更多详细信息以及文件访问示例

在您的特定情况下,您最终将使用文章中显示的技术和上面引用的代码示例将XDocument.ToString()写入所需的输出文件。

顺便说一句,对于了解文件系统(以及 Windows 应用商店编程特有的其他概念)的更全面和测量的方法,(免费)Microsoft App Builder 程序是一个很好的启动方式。

于 2013-05-21T15:02:25.700 回答
0

感谢 Jim O'Neil 的建议,我阅读了 MSDN 文档,最终了解到我的应用程序文件夹的 Asset 子文件夹是只读的。我使用了用户的 AppData 目录,这是我最终实现的等效解决方案,使用 Streams 而不是 Strings 来使用 LINQ to XML 加载和保存 de 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();
    }

我还必须管理 Stream 中的光标位置。不这样做会写入两次数据或写入文件中间,具体取决于光标所在的位置。

Jim 或任何人,如果代码可以进一步优化,欢迎您发表评论。

于 2013-05-25T17:30:50.187 回答