如何在uwp app中加载,编辑和保存xml

时间:2017-02-09 13:04:43

标签: c# xml uwp

标题说真的。我已经被困在这一天好几天了,我会很感激一些帮助。当主页首次加载它在本地文件夹中测试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位

1 个答案:

答案 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文件。一切都取决于您的需求。