我正在使用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
}
答案 0 :(得分:0)
您需要使用Windows.Storage APIs。在Windows 8的沙盒和异步世界中,您会发现在处理文件存储方面存在两个显着差异:
应用程序可以编程方式仅从该应用程序的“本地存储”访问数据,除非最终用户已授予应用程序特定权限,以便从文件系统中的其他位置存储/读取(通过{{3 }})
读取和写入文件是一种异步操作,因此您可以找到以“异步”结尾的大多数文件访问方法,并且您将使用(通常)file and folder pickers来利用它们< / p>
请查看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或任何人,如果可以进一步优化代码,欢迎您发表评论。