C# 如何使用WinRT打开打包文件

C# 如何使用WinRT打开打包文件,c#,xml,file,uri,windows-runtime,C#,Xml,File,Uri,Windows Runtime,我试图弄清楚如何将解析xml文件的.Net代码移植到WinRT。到目前为止,在的帮助下,我有以下代码。尽管如此,我还是在创建Uri后立即陷入困境: static readonly Uri ResourcesBase = new Uri(@"ms-resource://MyAssembly/"); public override async void Load() { Uri uri = new Uri(ResourcesBase, filePath);

我试图弄清楚如何将解析xml文件的.Net代码移植到WinRT。到目前为止,在的帮助下,我有以下代码。尽管如此,我还是在创建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让一切都变得更加艰难

编辑:

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

  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的构建操作设置为“内容”。对吗?我唯一能想到的是“嵌入式资源”,但我对此表示怀疑

完整的异常详细信息:

用户代码未处理System.ArgumentException

HResult=-2147024809

消息=值不在预期范围内

Source=Windows.Data.Xml.Dom

堆栈跟踪:

在Windows.Data.Xml.Dom.XmlDocument.LoadFromUriAsync(Uri、XmlLoadSettings和loadSettings)

在d:\Projects\Crystal\library\IO\File\XmlFileSerializer.cs中的Crystal.IO.File.XmlFileSerializer.d_u1.MoveNext()处:第32行

内部异常:


下载一个尽可能小的例子来重新解释这个问题:

我在看了之后终于明白了

public override async Load()
{
var file=await GetPackagedFile(“资产”,“world.xml”);
LoadXml(文件);
}
专用异步void LoadXml(存储文件)
{
XmlLoadSettings=new XmlLoadSettings(){ValidateOnParse=false};
XmlDocument xmlDoc=wait XmlDocument.LoadFromFileAsync(文件,设置);
foreach(xmlDoc.ChildNodes中的IXmlNode xmlNode)
{
//ProcessNode(xmlNode);
}
}
专用异步任务GetPackagedFile(字符串folderName,字符串文件名)
{
StorageFolder installFolder=Windows.ApplicationModel.Package.Current.InstalledLocation;
if(folderName!=null)
{
StorageFolder子文件夹=等待installFolder.GetFolderAsync(folderName);
返回等待子文件夹.GetFileAsync(文件名);
}
其他的
{
返回wait-installFolder.GetFileAsync(文件名);
}
}
}

您不应该只有一个尾随斜杠吗?也就是说,
Uri=新Uri(“ms-resource://MyAssembly/“+文件路径)。只有一个尾随斜杠或一个绝对文件路径(c:\…)都没有不同的效果。您能告诉我们
filePath
是什么样子吗?已更新以显示项目设置和filePath变量。
    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);
        }
    }
}