如何使用WinRT打开打包文件

本文关键字:文件 何使用 WinRT 包文件 | 更新日期: 2023-09-27 18:26:40

我正试图弄清楚如何将一些解析xml文件的.Net代码移植到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倍吗?

编辑:

我已经尝试了以下所有字符串,但得到了完全相同的错误:

  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下,只放在assets下。似乎没有什么不同。

另一件事是,我将xml的BuildAction设置为"Content"。这是正确的吗?我唯一能想到的是"嵌入式资源",但我对此表示怀疑

完整异常详细信息:

用户代码未处理System.ArgumentException

HResult=-2147028409

消息=值不在预期范围内。

Source=Windows.Data.Xml.Dom

StackTrace:

位于Windows.Data.Xml.Dom.XmlDocument.LoadFromUriAsync(Uri-Uri,XmlLoadSettings loadSettings)

位于d:''Projects''Crystal''library''IO''File''XmlFileSerializer.cs:line 32 中的Crystal.IO.File.XmlFileSerializeer.d__1.MoveNext()

内部异常:

下载尽可能小的例子来解决这个问题:test_xml.zip

如何使用WinRT打开打包文件

在查看了Windows运行时Xml数据API示例后,我终于明白了这一点。

    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);
        }
    }
}