当前位置:编程学习 > C#/ASP.NET >>

把XML文件放到资源文件中,怎么读取?

请教大家,之前我在项目(非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文件不能这样取吗? --------------------编程问答-------------------- 这样应该可以的
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); --------------------编程问答-------------------- 测试通过
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); --------------------编程问答--------------------
引用 2 楼 net_lover 的回复:
测试通过
System.Reflection.Assembly _assembly = System.Reflection.Assembly.GetExecutingAssembly();
System.IO.Stream sStream = _assembly.GetManifestResourceStream("WindowsFormsApplication1.XMLFile1.xml")……

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

--------------------编程问答-------------------- 嵌入的资源哪还有文件存在啊。都嵌入到dll了。 --------------------编程问答-------------------- 我现在想问的是怎样读取资源文件中的XML文件,而不用一定要去Bin/Debug目录下去找,不然别人同步代码之后难免会出现一些部署方面的问题 。 --------------------编程问答-------------------- --------------------编程问答-------------------- 操作方法
/upload/20131225/2011011309220674.png --------------------编程问答--------------------
引用 6 楼 net_lover 的回复:
你的工程里面。点xml文件-属性-生成操作-选择嵌入的资源,这样才叫嵌入

我现在不就是已经这样做了才成功的吗?
Build Action - Embedded Resource的中文不是 生成操作-嵌入的资源 ??? --------------------编程问答--------------------
引用 7 楼 net_lover 的回复:
操作方法
/upload/20131225/2011011309220674.png

我知道了,我之前把生成操作改成嵌入的资源,并把复制到输出目录改成总是复制,这样编译的时候就会把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);
就可以取到。 --------------------编程问答-------------------- 对的,
嵌入之后,就没有xml文件了 --------------------编程问答-------------------- 你嵌入之后,就不要xml文件了 --------------------编程问答--------------------
引用 10 楼 net_lover 的回复:
对的,
嵌入之后,就没有xml文件了

那现在问题是可以解决了,但是我如果换成使用资源文件,为什么取不到呢?资源文件中的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");
为什么取到的是空的? --------------------编程问答-------------------- 看楼主的意义就是找不到文件的问题,没必要用资源文件啊。
只要发布的时候包含这个文件,使用物理路径访问就可以了,物理路径可以在运行时计算出来。

资源文件参考:
http://blog.csdn.net/flyingdream123/article/details/3754470 --------------------编程问答-------------------- 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); --------------------编程问答--------------------
引用 14 楼 bossma 的回复:
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.Co……

我这个是Web的,不过看意思差不太多。 --------------------编程问答-------------------- 很简单,就要引用类名是一样,比如:namespace.class1。那么你的文件可以写成namespace.class1.filename.xml.方法和你写的是一样的,只不过不再需要使用绝对路径了。
XmlDocument xmlDoc = new XmlDocument();
  xmlDoc.Load("namespace.class1.filename.xml");,前提是这个文件是以键入资源存在的。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,