2013-04-04 93 views
1

如何獲取嵌入資源的資源Uri?如何獲取嵌入式資源的資源Uri?

我有一個方法如下,它驗證xml針對xsd文件。此方法是一個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; 
      } 

而且我沒有成功實施至今下面的方法!:

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

我的XSD位於:

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

回答

2

作爲一個快速簡單的解決方案:

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

謝謝,但只是返回資源名稱。無法將名稱添加到schemas.Add()集合中。它需要一個完整的路徑。 – 2013-04-04 11:00:40

3

我意識到它也接受XmlReader,所以這裏是我的解決方案,如果有人會有同樣的問題:

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

從MSDN引用:'在.NET Framework 2.0版本中,推薦的做法是使用XmlReader.Create方法創建XmlReader實例。這使您可以充分利用此版本中引入的新功能。有關更多信息,請參閱創建XML讀取器。「 - [link](http://msdn.microsoft.com/zh-cn/library/cssfs8c4.aspx) – 2013-04-04 11:24:59