读取嵌入式XML文件c#

读取嵌入式XML文件c#,c#,xml,C#,Xml,我如何读取嵌入式XML文件——一个属于c#项目的XML文件? 我已经在我的项目中添加了一个XML文件,我想从中读取。我希望XML文件与项目一起编译,因为我不希望它是用户可以看到的资源 有什么想法吗 确保XML文件是.csproj项目的一部分。(如果您可以在解决方案资源管理器中看到它,那就很好了。) 将XML文件的“Build Action”属性设置为“Embedded Resource” 使用以下代码在运行时检索文件内容: public string GetResourceTextFile(st

我如何读取嵌入式XML文件——一个属于c#项目的XML文件? 我已经在我的项目中添加了一个XML文件,我想从中读取。我希望XML文件与项目一起编译,因为我不希望它是用户可以看到的资源

有什么想法吗

  • 确保XML文件是.csproj项目的一部分。(如果您可以在解决方案资源管理器中看到它,那就很好了。)

  • 将XML文件的“Build Action”属性设置为“Embedded Resource”

  • 使用以下代码在运行时检索文件内容:

    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”应替换为项目名称和包含资源文件的文件夹

    更新


    实际上,
    assembly.folder
    应替换为命名空间,默认情况下,在与XML文件相同的文件夹中创建的类将在该命名空间中使用该命名空间。这通常是
    defaultNamespace.folder0.folder1.folder2…..

    将构建操作设置为Embedded Resource,然后编写以下内容:

    using (Stream stream = typeof(MyClass).Assembly.GetManifestResourceStream("MyNameSpace.Something.xml")) {
        //Read the stream
    }
    
  • 将文件添加到项目中
  • 将“Build Action”属性设置为“Embedded Resource”
  • 通过以下方式访问它:

    GetType().Module.Assembly.GetManifestResourceStream("namespace.folder.file.ext")
    
  • 请注意,资源名称字符串是文件名, 包括扩展名,前面是项目的默认命名空间。 如果资源位于文件夹内,则还必须将其包含在 绳子


    (来自,但我经常使用它)

    您还可以将XML文件添加为资源,然后使用
    资源对其内容进行寻址。YourXMLFileResourceName
    (作为字符串,即使用StringReader)。

    您可以使用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();
    
    @3Dave真的很有帮助(投票结果已给出),但是我的资源助手位于不同的程序集中,因此我执行了以下操作

    public string GetResourceFileText(string filename, string assemblyName)
        {
            string result = string.Empty;
    
            using (Stream stream = 
                System.Reflection.Assembly.Load(assemblyName).GetManifestResourceStream($"{assemblyName}.{filename}"))
            {
                using (StreamReader sr = new StreamReader(stream))
                {
                    result = sr.ReadToEnd();
                }
            }
            return result;
        }
    
    叫来

    GetResourceFileText("YourFileNameHere.ext", Assembly.GetExecutingAssembly().GetName().Name);
    

    你应该关闭小溪。此外,编写
    typeof(SomeType)
    .Assembly`将大大加快速度。您应该使用
    using
    语句关闭流。答案末尾的“注意”似乎不正确。请参阅此答案(),其中说明应输入项目的默认名称空间,而不仅仅是项目名称。仅仅使用项目的程序集名称对我来说不起作用。@ClearCloud8很好。默认名称空间会自动设置为项目名称,但这不是必需的,因此不应假定。如果需要列出已加载的所有资源,只需查看
    GetType().Assembly.GetManifestResourceNames()
    @ogrim您的注释几乎就是一个解决方案。伟大的类似的问题:很抱歉,“资源”从哪里来?我在这里隐含地假设了VisualStudio;一旦您将文件标记为嵌入资源,该类就会自动生成。@sunside感谢您的回复。在我的例子中,它没有生成资源类;是因为我将xml文件嵌入到测试类中吗?我不明白这有什么关系。VisualStudio也不会自动为我创建一个.cs包装器。也没有运行自定义工具的选项。它可能特定于项目的装配类型