2013-04-04 3 views
1

Comment obtenir la ressource Uri d'une ressource intégrée?Comment obtenir la ressource Uri d'une ressource intégrée?

J'ai une méthode comme ci-dessous qui valide un fichier XML par rapport à un fichier xsd. Cette méthode est utilisée dans un MSTest:

 public static string Validate(string xml, string relativeXsdFilePath) 
      { 
       var schemas = new XmlSchemaSet(); 

// relativeXsdFilePath like 'TestData.Xsd.XsdFile1.xsd' 
       var schemaUri = ResourceHelper.GetPath(relativeXsdFilePath); 

       schemas.Add("", schemaUri); 

       XDocument doc = XDocument.Load(new StringReader(xml)); 
       string msg = null; 
       doc.Validate(schemas, (o, e) => 
       { 
        msg = e.Message; 
       }); 
       return msg; 
      } 

Et je mettre en œuvre la méthode ci-dessous sans succès jusqu'à présent !:

public static string GetPath(string relativeFileName) 
    { 
     var assemblyName = new AssemblyName(Assembly.GetExecutingAssembly().FullName).Name; 

     var resourceName = GetResourceName(relativeFileName); 

// resource name would be like 'ProjectName.UnitTests.TestData.Xsd.profile.xsd' 
     var result = string.Format("/{0};component/{1}", assemblyName, resourceName); 

     return result; 
    } 

Mon XSD est situé ici:

ProjectRoot 
---TestData 
------Xsd 
---------XsdFile1.xsd 

Répondre

2

Comme solution simple et rapide:

public static string GetPath(string relativeFileName) 
{ 
    return Assembly.GetExecutingAssembly().GetManifestResourceNames().FirstOrDefault(x => x.EndsWith(relativeFileName)); 
} 
+2

merci mais cela renvoie juste le nom de la ressource. Il n'est pas possible d'ajouter juste le nom à la collection schemas.Add(). cela nécessite un chemin complet. –

3

Je me suis rendu compte qu'il accepte également XmlReader alors voici ma solution si quelqu'un aura le même problème:

public static XmlReader LoadAsXmlReader(string relativeFileName) 
     { 
      var result = LoadAsStream(relativeFileName); 

      var xmlReader = new XmlTextReader(result); 

      return xmlReader; 
     } 

     private static Stream LoadAsStream(string relativeFileName) 
     { 
      var resourceFileName = Assembly 
       .GetExecutingAssembly() 
       .GetManifestResourceNames() 
       .FirstOrDefault(p => p.EndsWith(relativeFileName)); 


      return Assembly 
       .GetExecutingAssembly() 
       .GetManifestResourceStream(resourceFileName); 
     } 
+0

Citant à partir de MSDN: 'Dans la version .NET Framework 2.0, la pratique recommandée consiste à créer des instances XmlReader à l'aide de la méthode XmlReader.Create. Cela vous permet de tirer pleinement parti des nouvelles fonctionnalités introduites dans cette version. Pour plus d'informations, voir Création de lecteurs XML. »- [lien] (http://msdn.microsoft.com/fr-fr/library/cssfs8c4.aspx) –

Questions connexes