2012-03-04 21 views
11

Estoy tratando de averiguar cómo portar un código .Net que analizó un archivo xml a WinRT. Hasta ahora, con la ayuda de The given System.Uri cannot be converted into a Windows.Foundation.Uri, tengo el siguiente código. Aún así, se queda bloqueado inmediatamente después creo el Uri:Cómo abrir un archivo empaquetado con WinRT

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

me sale una excepción no controlada cuando intento llamar XmlDocument.LoadFromUriAsyn (URI):

ArgumentException era controlada por el código de usuario - Valor hace no caer dentro del rango esperado.

¿Alguien más siente que todo es 10 veces más difícil con WinRT?

EDIT:

He intentado todas las siguientes cadenas, y obtener 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 

proyecto estableció:

Proyecto

  • Propiedades
  • Referencias
  • Activos
  • datos
    • world.xml código
  • Fuente ...

En Código:

filePath = "Data\\world.xml"; 

También he intentado poner el xml archivo bajo assset \ data, y solo assets. Nada parece hacer la diferencia.

Otra cosa, tengo la acción de compilación del conjunto xml en "Contenido". ¿Es eso correcto? La única otra cosa que podría imaginar que sería "Recurso incrustado", pero lo dudo.

detalles de excepción completos:

System.ArgumentException fue controlada por el código de usuario

HResult = -2147024809

Mensaje = Valor no entra 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:

Descargar el ejemplo más pequeño posible repro el tema: test_xml.zip

+0

¿No debería tener una sola barra al final? Es decir. 'Uri uri = new Uri (" ms-resource: // MyAssembly/"+ filePath);'. –

+0

Tener solo 1 barra inclinada, o una ruta de archivo absoluta (c: \ ...) no tienen ningún efecto diferente. –

+0

¿Puede mostrarnos cómo es 'filePath'? – user7116

Respuesta

16

finalmente lo he descubierto después miré 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); 
     } 
    } 
} 
Cuestiones relacionadas