2012-03-04 6 views
11

J'essaie de comprendre comment porter un code .Net qui a analysé un fichier xml à WinRT. Jusqu'à présent, avec l'aide de The given System.Uri cannot be converted into a Windows.Foundation.Uri, j'ai le code ci-dessous. Pourtant, je suis bloqué immédiatement après avoir créé l'Uri:Comment ouvrir un fichier empaqueté avec 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); 
     } 
    } 

je reçois une exception non gérée quand je tente d'appeler XmlDocument.LoadFromUriAsyn (uri):

ArgumentException était non gérée par le code utilisateur - La valeur ne ne pas tomber dans la fourchette attendue. Quelqu'un d'autre a l'impression que tout est 10 fois plus dur avec WinRT?

EDIT:

J'ai essayé toutes les chaînes suivantes, et obtenir exactement la même erreur:

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 

projet mis en place:

Projet

  • Propriétés
  • Références
  • actifs
  • données
    • world.xml
  • code source ...

Dans le code:

filePath = "Data\\world.xml"; 

J'ai aussi essayé de mettre le xml fichier sous assset \ data, et juste des assets. Rien ne semble faire la différence.

Une autre chose, j'ai l'action de construction du jeu de xml à "Content". Est-ce exact? La seule autre chose que je pourrais imaginer serait "Embedded Resource" mais j'en doute.

Détails de l'exception complète:

System.ArgumentException était non gérée par le code utilisateur

HResult = -2147024809

message = valeur ne tombe pas dans la fourchette prévue.

Source = Windows.Data.Xml.Dom

StackTrace:

à Windows.Data.Xml.Dom.XmlDocument.LoadFromUriAsync (Uri uri, XmlLoadSettings loadSettings)

à Crystal.IO .File.XmlFileSerializer.d__1.MoveNext() dans d: \ Projects \ Crystal \ bibliothèque \ IO \ File \ XmlFileSerializer.cs: ligne 32

InnerException:

Télécharger le plus petit exemple possible de repro la question: j'ai finalement test_xml.zip

+0

Vous ne devriez pas avoir un seul slash final? C'est à dire. 'Uri uri = nouvel Uri (" ms-resource: // MyAssembly/"+ filePath);'. –

+0

Avoir seulement 1 barre oblique ou un chemin de fichier absolu (c: \ ...) n'ont pas d'effet différent. –

+0

Pouvez-vous nous montrer à quoi ressemble 'filePath'? – user7116

Répondre

16

dehors après avoir regardé 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); 
     } 
    } 
}