2010-05-12 126 views
52

如何從嵌入式XML文件讀取 - 作爲c#項目一部分的XML文件? 我已經將XML文件添加到了我的項目中,並且我想從中讀取它。我希望XML文件能夠與該項目一起編譯,因爲我不希望它會成爲用戶可以看到的資源。閱讀嵌入式XML文件c#

有什麼想法?

+1

類似的問題,事:HTTP://計算器。com/questions/3314140/how-to-read-embedded-resource-text-file – ClearCloud8 2013-09-11 16:32:10

回答

84
  1. 確保XML文件是.csproj項目的一部分。 (如果你可以在解決方案資源管理器中看到它,那就很好。)

  2. 將XML文件的「Build Action」屬性設置爲「Embedded Resource」。

  3. 使用下面的代碼在運行時檢索文件內容:

    public string GetResourceTextFile(string filename) 
    { 
        string result = string.Empty; 
    
        using (Stream stream = this.GetType().Assembly. 
           GetManifestResourceStream("assembly.folder."+filename)) 
        { 
         using (StreamReader sr = new StreamReader(stream)) 
         { 
          result = sr.ReadToEnd(); 
         } 
        } 
        return result; 
    } 
    

每當你想讀取文件內容,只需要使用

string fileContents = GetResourceTextFile("myXmlDoc.xml"); 

注意,「組裝。文件夾「應替換爲包含資源文件的項目名稱和文件夾。

更新

其實,assembly.folder應利用在同一文件夾中的XML文件中創建一個類將有默認的命名空間所取代。這通常是defaultNamespace.folder0.folder1.folder2.....

+4

答案結尾處的「註釋」看起來不正確。請參閱此答案(http://stackoverflow.com/a/3314213/940783),其中聲明您應該輸入項目的默認名稱空間,而不僅僅是項目名稱。只是使用項目的程序集名稱不適合我。 – ClearCloud8 2013-09-11 16:31:19

+0

@ClearCloud8良好的通話。默認名稱空間自動設置爲項目名稱,但這不是必需的,因此不應假定。 – 2013-09-12 22:57:31

+7

如果您需要列出所有加載的資源,請查看'GetType()。Assembly.GetManifestResourceNames()' – ogrim 2015-02-23 08:23:09

12

設置生成操作嵌入的資源,然後寫:

using (Stream stream = typeof(MyClass).Assembly.GetManifestResourceStream("MyNameSpace.Something.xml")) { 
    //Read the stream 
} 
+0

這一個爲我工作。 – Mike 2011-06-23 14:08:33

2
  1. 將文件添加到項目中。
  2. 將「Build Action」屬性設置爲「Embedded Resource」。
  3. 訪問這樣說:

    GetType().Module.Assembly.GetManifestResourceStream("namespace.folder.file.ext") 
    

注意,資源名稱字符串的文件,包括 擴展的名字,通過該項目的默認命名空間之前。 如果資源位於文件夾內,則還必須將其包含在 字符串中。

(從http://www.dotnet247.com/247reference/msgs/1/5704.aspx,但我用它pesonally)

26

您還可以添加XML文件作爲一種資源,然後用Resources.YourXMLFilesResourceName解決其內容(字符串,即使用StringReader)。

+3

這非常容易! – 2012-07-22 15:31:59

+2

我很抱歉,'資源'來自哪裏? – stt106 2015-08-12 16:04:49

+0

我在這裏暗示了Visual Studio;只要將文件標記爲嵌入式資源,該類就應自動生成。 – sunside 2015-08-12 16:19:53

8

您可以使用Reflector(免費從http://www.red-gate.com/products/reflector/)查找嵌入式XML文件的路徑。

然後,它只是一個

Assembly a = typeof(Assembly.Namespace.Class).Assembly; 

Stream s = a.GetManifestResourceStream("Assembly.Namespace.Path.To.File.xml"); 
XmlDocument mappingFile = new XmlDocument(); 
mappingFile.Load(s); 
s.Close(); 
+1

您應該關閉該流。另外,編寫'typeof(SomeType)'.Assembly'會更快。 – SLaks 2010-05-12 16:03:46

+0

完成。偉大的觀點。 – Jamie 2010-05-12 16:17:59

+4

您應該使用'using'語句關閉流。 – SLaks 2010-05-12 16:46:18