C# 如何使用WinRT打开打包文件
我试图弄清楚如何将解析xml文件的.Net代码移植到WinRT。到目前为止,在的帮助下,我有以下代码。尽管如此,我还是在创建Uri后立即陷入困境: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);
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);
}
}
}