我试图弄清楚如何将解析xml文件的一些.Net代码移植到WinRT。到目前为止,在The given System.Uri cannot be converted into a 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
项目设置:
项目
在代码中:
filePath = "Data\\world.xml";
我还尝试将xml文件放在assset \ data下,只放置资产。似乎没什么区别。
另一件事,我将xml的Build Action设置为“Content”。那是对的吗?我能想到的另一件事就是“嵌入式资源”,但我对此表示怀疑。
完整例外详情:
System.ArgumentException未被用户代码
处理的HResult = -2147024809
消息=值不在预期范围内。
源= Windows.Data.Xml.Dom
堆栈跟踪:
在Windows.Data.Xml.Dom.XmlDocument.LoadFromUriAsync(Uri uri,XmlLoadSettings loadSettings)
位于d:\ Projects \ Crystal \ library \ IO \ File \ XmlFileSerializer.cs中的Crystal.IO.File.XmlFileSerializer.d__1.MoveNext():第32行
InnerException:
下载可能重复问题的最小示例:test_xml.zip
答案 0 :(得分:16)
在我查看Windows Runtime Xml data API sample之后,我终于明白了。
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);
}
}
}