Как открыть упакованный файл с WinRT - PullRequest
11 голосов
/ 04 марта 2012

Я пытаюсь выяснить, как перенести некоторый код .Net, который анализировал XML-файл, на WinRT. Пока что с помощью данный System.Uri не может быть преобразован в Windows.Foundation.Uri , у меня есть код ниже. Тем не менее, я застреваю сразу после создания Uri:

    static readonly Uri ResourcesBase = new Uri(@"ms-resource://MyAssembly/"); 
    public override async void Load()
    {
        Uri uri = new Uri(ResourcesBase, filePath); // filePath = "Data//world.xml";
        XmlLoadSettings settings = new XmlLoadSettings() { ValidateOnParse = false };

        XmlDocument xmlDoc = await XmlDocument.LoadFromUriAsync(uri, settings);

        foreach (IXmlNode xmlNode in xmlDoc.ChildNodes)
        {
            ProcessNode(xmlNode);
        }
    }

Я получаю необработанное исключение при попытке вызвать XmlDocument.LoadFromUriAsyn (uri):

ArgumentException не было обработано кодом пользователя - значение не попадает в ожидаемый диапазон.

Кто-нибудь еще чувствует, что с WinRT все в 10 раз сложнее?

EDIT:

Я перепробовал все следующие строки и получил точно такую ​​же ошибку:

  Uri uri = new Uri("ms-resource://MyAssembly//" + filePath);
  Uri uri = new Uri("ms-resource://MyAssembly/" + filePath);
  Uri uri = new Uri("d:\\projects\\crystal\\" + filePath); // A valid absolute path

Настройка проекта:

Проект

  • Свойства
  • Ссылки
  • Активы
  • Данные
    • world.xml
  • Исходный код ...

В коде:

  filePath = "Data\\world.xml";

Я также пытался поместить xml-файл в группу assset \ data и просто активировать. Ничто, кажется, не имеет значения.

Другое дело, у меня для параметра «Действие сборки» для xml установлено «Содержимое». Это верно? Единственное, что я мог себе представить, это «Встроенный ресурс», но я сомневаюсь в этом.

Полная информация об исключении:

System.ArgumentException не был обработан кодом пользователя

HResult = -2147024809

Сообщение = значение не попадает в ожидаемый диапазон.

Источник = Windows.Data.Xml.Dom

StackTrace:

в Windows.Data.Xml.Dom.XmlDocument.LoadFromUriAsync (Uri uri, XmlLoadSettings loadSettings)

в Crystal.IO.File.XmlFileSerializer.d__1.MoveNext () в d: \ Projects \ Crystal \ library \ IO \ File \ XmlFileSerializer.cs: строка 32

InnerException:

Загрузите наименьший возможный пример, чтобы повторить проблему: test_xml.zip

1 Ответ

16 голосов
/ 05 марта 2012

Я, наконец, понял это после того, как посмотрел на Пример API данных среды выполнения Windows * .

    public override async Load()
    {
        var file = await GetPackagedFile("assets", "world.xml");
        LoadXml(file);
    }

    private async void LoadXml(StorageFile file)
    {
        XmlLoadSettings settings = new XmlLoadSettings() { ValidateOnParse = false };
        XmlDocument xmlDoc = await XmlDocument.LoadFromFileAsync(file, settings);

        foreach (IXmlNode xmlNode in xmlDoc.ChildNodes)
        {
            //ProcessNode(xmlNode);
        }
    }

    private async Task<StorageFile> GetPackagedFile(string folderName, string fileName)
    {
        StorageFolder installFolder = Windows.ApplicationModel.Package.Current.InstalledLocation;

        if (folderName != null)
        {
            StorageFolder subFolder = await installFolder.GetFolderAsync(folderName);
            return await subFolder.GetFileAsync(fileName);
        }
        else
        {
            return await installFolder.GetFileAsync(fileName);
        }
    }
}
...