c# xml file uri windows-runtime
test_xml.zip

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