标题说真的。我已经被困在这一天好几天了,我会很感激一些帮助。当主页首次加载它在本地文件夹中测试settings.xml并且如果找不到则复制它时,我有一个主页面和一个设置页面。然后,当用户打开设置页面时,它应该从本地文件夹加载详细信息,允许用户在从OnNavigatedFrom事件中将它们保存回本地文件夹之前进行编辑。
从安装文件夹加载到本地文件夹的代码
// Has the file been copied already?
bool blFileExist = false;
try
{
await ApplicationData.Current.LocalFolder.GetFileAsync("settings.xml");
// No exception means it exists
blFileExist = true;
btnSettings.Foreground = new SolidColorBrush(Windows.UI.Colors.White);
}
catch (System.IO.FileNotFoundException)
{
// The file obviously doesn't exist
blFileExist = false;
btnSettings.Foreground = new SolidColorBrush(Windows.UI.Colors.Red);
}
catch (Exception)
{
}
if (!blFileExist)
{
try
{
// Cant await inside catch, but this works anyway
StorageFile stopfile = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync("settings.xml");
await stopfile.CopyAsync(ApplicationData.Current.LocalFolder);
}
catch (System.IO.FileNotFoundException)
{
}
catch (Exception)
{
}
}
加载和保存设置页面的代码
private void loadSettings()
{
try
{
doc = XElement.Load("settings.xml");
nAIPlayers = int.Parse(doc.Element("ai_players").Value);
strCardBack = doc.Element("back").Value;
comboBoxAIPlayers.SelectedIndex = nAIPlayers - 1;
}
catch (System.IO.FileNotFoundException)
{
}
catch (Exception ex)
{
}
}
private async void saveSettings()
{
//try
//{
StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync("settings.xml");
using (Stream fileStream = await file.OpenStreamForWriteAsync())
{
doc.SetElementValue("ai_players", nAIPlayers);
doc.SetElementValue("back", "Back_0");
doc.Save(fileStream);
}
/*}
catch (System.IO.FileNotFoundException)
{
}
catch (Exception ex)
{
}*/
}
我认为问题是我正在访问本地文件以保存它和安装文件来加载它。结果是无论我保存什么,它总是读取原始settings.xml中的值
如何从本地文件夹加载?
doc = XElement.Load(“settings.xml”);
更新
在第一次迭代中,代码运行正常,设置页面代码按原样打开。只有在离开设置页面并运行saveSettings()方法后它才会失败,并在重新加载设置页面并运行loadSettings()时抛出错误。
System.Xml.XmlException:根级别的数据无效。第5行,第12位
答案 0 :(得分:2)
你做错了因为你正在使用XElement.Load(string),其中字符串代表 URI ,在这种情况下应该是:
Uri参数必须是文件系统相对路径或绝对路径。
并且你会在 UWP 中遇到问题,因为通常你没有权限。它还使用 URI 来完成这项工作:"ms-appdata:///settings.xml"
。
可能你可以阅读你的 LocalFolder 的路径并使用它(虽然没有经过测试但可以工作),但更容易从流中加载内容(或读取字符串)从文件中,然后从该字符串加载XML),例如:
var file = await ApplicationData.Current.LocalFolder.GetFileAsync("settings.xml");
using(var stream = await file.OpenStreamForReadAsync())
{
var doc = XElement.Load(stream);
// ...
}
另请注意,还有其他类,如 XDocument 或 XmlDocument ,您可以在其中加载和管理xml文件。一切都取决于您的需求。