2017-02-09 2 views
0

Заголовок говорит, что все это действительно так. Я застрял на этом в течение нескольких дней и был бы рад помочь. У меня есть главная страница и страница настроек, когда главная страница загружается с первого раза, когда она проверяет файл settings.xml в локальной папке и копирует ее, если не найден. Затем, когда пользователь открывает страницу настроек, он должен загружать данные из локальной папки, позволяя пользователю редактировать, прежде чем сохранять их обратно в локальную папку из события OnNavigatedFrom.Как загрузить, отредактировать и сохранить xml в приложении uwp

кода для загрузки из папки установки в локальную папку

// 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) 
     { 

     }*/ 
    } 

Я думаю, что проблема я получить доступ к локальному файлу, чтобы сохранить его и файл установки для его загрузки. Результат - независимо от того, что я сохраняю, он всегда читает значения в исходных настройках. Xml

Как загрузить это из локальной папки?

doc = XElement.Load ("settings.xml");

Update

На первой итерации код прекрасно работает и код страницы настройки открывается, как это должно быть. Это только после выхода из страницы настроек и запуска метода saveSettings(), который он терпит неудачу, и выдает ошибку при перезагрузке страницы настроек и запуске loadSettings().

System.Xml.XmlException: данные на корневом уровне недействительны. Строка 5, позиция 12

ответ

2

Вы делаете это неправильно, потому что вы используете XElement.Load(string), где строка обозначает URI, который в этом случае должен быть:

Параметр Uri должен быть файловая система родственнику или абсолютный путь.

и что вы будете иметь проблемы в UWP, как правило, не имеют разрешения. Он также не будет работать здесь с URI s нравится: "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-файл. Все зависит от ваших потребностей.

+0

Спасибо. Я так много обновил. – luigivampa

+0

@luigivampa Похоже, вы пишете неправильный файл XML, поэтому данные неверны. Лучшее - просто отлаживайте его, сохраняйте/копируйте этот файл в KnownFolder, чтобы посмотреть, как он выглядит, или [используйте ISE] (http://stackoverflow.com/a/33063501/2681948) - каким-то образом откройте файл и посмотрите, что не так , – Romasz

Смежные вопросы