XDocument.Save(字符串)不可用

时间:2013-05-21 14:00:41

标签: xml linq windows-8 visual-studio-2012 linq-to-xml

我正在使用VS 2012 Express for Windows 8.我想加载XML文件,修改其内容然后将其保存回磁盘。

到目前为止,我一直在使用LINQ to XML,我已经能够加载文件,更改一些节点信息。

我想使用XDocument.Save(string)方法将文件保存回磁盘,但是intellisense不包含该方法,尽管在联机文档中有记录。

知道为什么吗?

由于

--- --- UPDATE

这是我正在尝试做的事情

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
}

2 个答案:

答案 0 :(得分:0)

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

  1. 应用程序可以编程方式仅从该应用程序的“本地存储”访问数据,除非最终用户已授予应用程序特定权限,以便从文件系统中的其他位置存储/读取(通过{{3 }})

  2. 读取和写入文件是一种异步操作,因此您可以找到以“异步”结尾的大多数文件访问方法,并且您将使用(通常)file and folder pickers来利用它们< / p>

  3. 请查看Windows开发人员中心的async/await pattern以获取更多详细信息以及File access and permissions in Windows Store apps topic

    在您的具体情况下,您最终将使用上文引用的文章和代码示例中显示的技术将File access sample写入所需的输出文件。

    顺便说一句,对于学习文件系统(以及Windows Store编程特有的其他概念)的更全面和更有效的方法,XDocument.ToString()是一个很好的方法。

答案 1 :(得分:0)

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

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

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