c# - Cómo abrir un archivo empaquetado con WinRT
xml file (1)
Estoy tratando de descubrir cómo portar un código .Net que analizó un archivo xml a WinRT. Hasta ahora, con la ayuda de The given System.Uri no se puede convertir en Windows.Foundation.Uri , tengo el siguiente código. Aún así, me quedo atrapado inmediatamente después de crear el 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);
}
}
Obtengo una excepción no controlada cuando intento llamar a XmlDocument.LoadFromUriAsyn (uri):
ArgumentException no fue manejado por el código de usuario - El valor no está dentro del rango esperado.
¿Alguien más siente que todo es 10 veces más difícil con WinRT?
EDITAR:
He intentado todas las siguientes cadenas y obtengo exactamente el mismo error:
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
Configuración del proyecto:
Proyecto
- Propiedades
- Referencias
- Bienes
- Datos
- world.xml
- Código fuente...
En codigo:
filePath = "Data//world.xml";
También he intentado poner el archivo xml bajo assset / data, y solo assets. Nada parece hacer la diferencia.
Otra cosa, tengo la acción Build del xml establecida en "Contenido". ¿Es eso correcto? La única otra cosa que podría imaginar que sería "Recurso incrustado", pero lo dudo.
Detalles completos de la excepción:
System.ArgumentException no fue manejado por el código de usuario
HResult = -2147024809
Mensaje = El valor no está dentro del rango esperado.
Fuente = Windows.Data.Xml.Dom
StackTrace:
en Windows.Data.Xml.Dom.XmlDocument.LoadFromUriAsync (Uri uri, XmlLoadSettings loadSettings)
en Crystal.IO.File.XmlFileSerializer.d__1.MoveNext () en d: / Projects / Crystal / library / IO / File / XmlFileSerializer.cs: línea 32
InnerException:
Descargue el ejemplo más pequeño posible para reproducir el problema: test_xml.zip
Finalmente lo descubrí después de ver el ejemplo de la API de datos de Windows Runtime Xml .
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);
}
}
}