2010-05-12 45 views
52

Làm cách nào để đọc từ tệp XML được nhúng - tệp XML là một phần của dự án C#? Tôi đã thêm một tệp XML vào dự án của mình và tôi muốn đọc từ đó. Tôi muốn tệp XML biên dịch với dự án vì tôi không muốn nó sẽ là tài nguyên mà người dùng có thể thấy.Đọc tệp XML nhúng C#

Bất kỳ ý tưởng nào?

+1

câu hỏi tương tự: http: // stackoverflow.com/questions/3314140/how-to-read-embedded-resource-text-file – ClearCloud8

Trả lời

84
  1. Đảm bảo tệp XML là một phần của dự án .csproj của bạn. (Nếu bạn có thể nhìn thấy nó trong trình thám hiểm giải pháp, bạn tốt.)

  2. Đặt thuộc tính "Xây dựng hành động" cho tệp XML thành "Tài nguyên được nhúng".

  3. Sử dụng đoạn mã sau để truy xuất nội dung tập tin tại thời gian chạy:

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

Bất cứ khi nào bạn muốn đọc nội dung tập tin, chỉ cần sử dụng

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

Lưu ý rằng "lắp ráp. thư mục "nên được thay thế bằng tên dự án và thư mục chứa tệp tài nguyên.

Cập nhật

Trên thực tế, assembly.folder nên được thay thế bởi không gian tên trong đó một lớp được tạo ra trong cùng thư mục với file XML sẽ phải theo mặc định. Đây thường là defaultNamespace.folder0.folder1.folder2......

+4

"Ghi chú" ở cuối câu trả lời của bạn có vẻ không chính xác. Xem câu trả lời này (http://stackoverflow.com/a/3314213/940783) mà nói rằng bạn nên nhập không gian tên mặc định của dự án của bạn, không chỉ tên dự án. Chỉ cần sử dụng tên lắp ráp của dự án đã không làm việc cho tôi. – ClearCloud8

+0

@ ClearCloud8 cuộc gọi tốt. Không gian tên mặc định được đặt tự động thành tên dự án, nhưng đó không phải là yêu cầu và do đó không được giả định. –

+7

Nếu bạn cần liệt kê tất cả các tài nguyên được tải, chỉ cần nhìn vào 'GetType(). Assembly.GetManifestResourceNames()' – ogrim

12

Set Build Action để Embedded Resource, sau đó viết như sau:

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

Điều này làm việc cho tôi. – Mike

2
  1. Thêm tập tin vào dự án.
  2. Đặt thuộc tính "Xây dựng hành động" thành "Tài nguyên được nhúng".
  3. Tiếp cận nó theo cách này:

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

ý rằng chuỗi tên tài nguyên là tên của tập tin, bao gồm phần mở rộng, trước bởi không gian tên mặc định của dự án. Nếu tài nguyên nằm trong một thư mục, bạn cũng phải bao gồm nó trong chuỗi .

(từ http://www.dotnet247.com/247reference/msgs/1/5704.aspx, nhưng tôi sử dụng nó pesonally)

26

Bạn cũng có thể thêm các tập tin XML như là một tài nguyên và sau đó giải quyết nội dung của nó với Resources.YourXMLFilesResourceName (như là một chuỗi, ví dụ sử dụng một StringReader).

+3

Điều đó dễ dàng hơn nhiều! –

+2

Tôi xin lỗi nhưng 'Tài nguyên' đến từ đâu? – stt106

+0

Tôi ngầm giả sử Visual Studio ở đây; lớp đó sẽ được tự động phát hiện ngay sau khi bạn đánh dấu một tệp là tài nguyên được nhúng. – sunside

8

Bạn có thể sử dụng Trình phản xạ (miễn phí từ http://www.red-gate.com/products/reflector/) để tìm đường dẫn đến tệp XML được nhúng.

Sau đó, nó chỉ là một vấn đề của

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

Bạn nên đóng luồng. Ngoài ra, việc viết 'typeof (SomeType)' .Assembly' sẽ nhanh hơn _substantially_. – SLaks

+0

Xong. Điểm tuyệt vời. – Jamie

+4

Bạn nên đóng luồng bằng câu lệnh 'using'. – SLaks