请教大家,之前我在项目(非ASP.NET)中新加了一个XML文件,然后使用
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load("./MyXML.xml");
找不到这个文件,错误提示说明必须要把这个文件拷贝到Bin/Debug目录下,折腾半天,把这个XML文件的Build Action改成了Embedded Resource,以及Copy always,才会让它自动拷贝。现在我想用另一种方式,即资源文件来解决,我在项目里加了一个Resource1.resx资源文件,把XML文件放到资源文件中,然后去取,无奈又取不到,所以来问问原因,应该怎么取?
ResourceManager temp = new ResourceManager("WpfApplication53.Resource1", typeof(Resource1).Assembly);
XmlDocument x = (XmlDocument)temp.GetObject("MyXML.xml");
资源文件中普通的字符串可以用temp.GetString()取到,那么XML文件不能这样取吗?

解决方案 »

  1.   

    这样应该可以的
    System.Reflection.Assembly _assembly = System.Reflection.Assembly.GetExecutingAssembly();
    System.IO.Stream sStream = _assembly.GetManifestResourceStream("MyNamespace.xxx.xml");
    System.Xml.XmlDocument doc = new XmlDocument();
    doc.Load(sStream);
      

  2.   

    测试通过
    System.Reflection.Assembly _assembly = System.Reflection.Assembly.GetExecutingAssembly();
    System.IO.Stream sStream = _assembly.GetManifestResourceStream("WindowsFormsApplication1.XMLFile1.xml");
    System.Xml.XmlDocument docx = new XmlDocument();
    docx.Load(sStream);
    MessageBox.Show(docx.OuterXml);
      

  3.   

    这样的前提是这个XML文件必须是在Bin/Debug目录下,跟我之前直接把这个XML文件的Build Action改成Embedded Resource,以及Copy always,然后使用xmlDoc.Load("");不是没有任何区别吗?
      

  4.   

    嵌入的资源哪还有文件存在啊。都嵌入到dll了。
      

  5.   

    我现在想问的是怎样读取资源文件中的XML文件,而不用一定要去Bin/Debug目录下去找,不然别人同步代码之后难免会出现一些部署方面的问题 。
      

  6.   

    本帖最后由 net_lover 于 2011-09-28 16:19:38 编辑
      

  7.   

    操作方法
    http://pic002.cnblogs.com/images/2011/50603/2011011309220674.png
      

  8.   

    我现在不就是已经这样做了才成功的吗?
    Build Action - Embedded Resource的中文不是 生成操作-嵌入的资源 ???
      

  9.   

    我知道了,我之前把生成操作改成嵌入的资源,并把复制到输出目录改成总是复制,这样编译的时候就会把XMl文件拷贝到Bin/Debug目录下,因此我用xmlDoc.Load("");可以找到。
    你的代码只要把生成操作改成嵌入的资源,不需要复制文件,
    System.Reflection.Assembly _assembly = System.Reflection.Assembly.GetExecutingAssembly();
    System.IO.Stream sStream = _assembly.GetManifestResourceStream("MyNamespace.xxx.xml");
    System.Xml.XmlDocument doc = new XmlDocument();
    doc.Load(sStream);
    就可以取到。
      

  10.   

    对的,
    嵌入之后,就没有xml文件了
      

  11.   

    你嵌入之后,就不要xml文件了
      

  12.   

    那现在问题是可以解决了,但是我如果换成使用资源文件,为什么取不到呢?资源文件中的xml文件该怎么取?请教一下。
    因为资源文件中的字符串很容易取到:
    ResourceManager temp = new ResourceManager("WpfApplication53.Resource1", typeof(Resource1).Assembly);
    string s = temp.GetString("String1");那XML文件不能这样取吗?
    ResourceManager temp = new ResourceManager("WpfApplication53.Resource1", typeof(Resource1).Assembly);
    XmlDocument x = (XmlDocument)temp.GetObject("MyXML.xml");
    为什么取到的是空的?
      

  13.   

    看楼主的意义就是找不到文件的问题,没必要用资源文件啊。
    只要发布的时候包含这个文件,使用物理路径访问就可以了,物理路径可以在运行时计算出来。资源文件参考:
    http://blog.csdn.net/flyingdream123/article/details/3754470
      

  14.   

    1、嵌入文件VeryCodes.Web.Controls.Area.Area.xml,2、AssemblyInfo.cs中添加
    //Area
    [assembly: WebResource("VeryCodes.Web.Controls.Area.Area.xml", "text/xml")]3、程序中访问:
    string XmlUrl = "VeryCodes.Web.Controls.Area.Area.xml";
    System.Reflection.Assembly thisExe = System.Reflection.Assembly.GetExecutingAssembly();
    System.IO.Stream file = thisExe.GetManifestResourceStream(XmlUrl);
      

  15.   

    我这个是Web的,不过看意思差不太多。
      

  16.   

    很简单,就要引用类名是一样,比如:namespace.class1。那么你的文件可以写成namespace.class1.filename.xml.方法和你写的是一样的,只不过不再需要使用绝对路径了。
    XmlDocument xmlDoc = new XmlDocument();
      xmlDoc.Load("namespace.class1.filename.xml");,前提是这个文件是以键入资源存在的。