zoukankan      html  css  js  c++  java
  • C# 读取 XML(嵌入资源文件)(转)

    在好多的C#和 .Net的论坛中都会提到如何使用内嵌资源的话题,对大多一般的数项目来说,这也许更不就不是一个问题.但是,对于一些复杂的项目,这也许就成了问题.本文会把论坛中的内容汇总一下,比起查询论坛来,文章显得更容易查找和连接.

    第一件清楚的事情

    在VS.Net中,有多种使用资源文件的方法,最常用的方法是让Form来保存它所使用的资源文件,这个可以通过产生一个.resx文件来保存Form所用到的资源.本文不是讨论这个话题,因为通常开发人员不会关心这个简单的问题.

    第二种方法是使用资源文件,本文重点在这儿,包括如何在资源文件中添加文件,如何设置内嵌资源的”生成类型”.

    名称是如何规定的?

    当你使用内嵌资源文件时,通常要知道资源的名称.实际上它可以像一个文件名,但是通常会比文件名更复杂一点点.

    命名一般包括三个部分:<缺省的命名空间.><扩展命命名空间.><文件名>

    上面的第一部分和最后的第三部分都好理解. 缺省的命名空间就是项目的命名空间,文件名就是资源文件的名称.中间的这部分可能有些迷惑.

    简单的讲,扩展命名空间就是项目中的目录结构.如果你的资源文件就在项目的根目录下,扩展命名空间就不需要了,直接这样写就可以了. <缺省的命名空间.> <文件名>. 但是如果你在项目中产生目录结果的话,就要使用使用扩展命名空间了.比如你在项目的根目录下产生了一个Images目录,那么资源文件就要这样来表示: <缺省的命名空间.> Images.<文件名>. 如果你在Images路径下还有一个目录FormGraphics,那么资源文件就要这样表示: <缺省的命名空间.> Images.FormGraphics.<文件名>

    我想大家可能已经发现了上面的规律,在代码中你也可以这么写.当你在目录下使用VS自动产生了类,它也是安装这样的方式来命名类的名称. <缺省的命名空间.><扩展命命名空间.>. 虽然你可以手工的修改代码中的命名空间,但是有一点要记住,是不可以修改内嵌资源文件的命名空间结构的.

    如何得到资源

    普通方法

    普通的使用内嵌资源文件的方法是使用Assembly类的GetManifestResource方法.在第一个演示程序中,我们会使用下面这两个方法GetManifestResourceNames, GetManifestResourceStream

    这个演示程序会列举出一个装配件中的资源,可以把存选中的资源保到一个文件中.如果资源是一个图象,在程序中就可以显示出来.如果你还没有一个内嵌资源的装配件,第二个演示程序就是一个含有资源的装配件.

    这是在ListBox的 ListBox's SelectedIndexChanged 事件中,如果出来资源

    System.IO.Stream stream = loadedAssembly.GetManifestResourceStream(

    (string) resources.SelectedItem);

    System.Drawing.Image img = Image.FromStream(stream);

    上面的演示程序把一个装配件调入内存,在loadedAssembly变量中存储一个Assembly实例.也许在你的应用程序中,不需要调用其他装配件的资源,你只是想能从你自己的程序中得到资源.

    最简单的方法是使用Type类的Assembly属性来得到某一个类的一个实例,你可以用下面的方法来得到Type,如果是一个类,使用typeof(<class>),如果是一个类的实例变量,使用GetType().

    另一种实现方法

    GetManifestResourceStream有两种重载方法,一种是从一个资源文件中来得到一个Stream对象, 另一个中使用Type和string. 第二个会帮助我们得到可以使用的资源.它会根据清单资源的范围由指定类型的命名空间确定资源清单

    第二个演示程序是利用上面说得第二个方法来实现的.

    总结

    当你理解了上面的内容后,对于VS.net内嵌资源的使用就是易于反掌了.唯一要注意的地方就是找出VS.Net给你的资源文件的名字.

    一个简单的读取资源文件的方法:

    代码
    public void LoadXMLFile()//从XML读取设置的信息
            {
                XmlTextReader reader;
                
    if (File.Exists("BlockSet.xml"))//判断文件是否存在
                {
                    
    //首先读取硬盘里的BlockSet.xml文件
                    reader = new XmlTextReader("BlockSet.xml");
                }
                
    else
                {
                    
    //如果不存在 则从嵌入资源内读取 BlockSet.xml 
                    Assembly asm = Assembly.GetExecutingAssembly();//读取嵌入式资源
                    Stream sm = asm.GetManifestResourceStream("Tetris.BlockSet.xml");
                    reader 
    = new XmlTextReader(sm);
                }
                
    string key = "";
                
    try
                {
                    
    while(reader.Read())
                    {
                        
    if(reader.NodeType==XmlNodeType.Element)
                        {
                            
    if (reader.Name == "id")
                            {
                                key 
    = reader.ReadElementString().Trim();
                                info.Add(key, 
    "");
                            }
                            
    else if(reader.Name=="color")
                            {
                                info[key] 
    = reader.ReadElementString().Trim();
                            }
                            
    else if (reader.Name == "DownKey")
                            {
                                _downKey 
    =(Keys)Convert.ToInt32(reader.ReadElementString().Trim());
                            }
                            
    else if (reader.Name == "DropKey")
                            {
                                _dropKey 
    =(Keys)Convert.ToInt32(reader.ReadElementString().Trim());
                            }
                            
    else if (reader.Name == "MoveLeftKey")
                            {
                                _moveLeftKey 
    = (Keys)Convert.ToInt32(reader.ReadElementString().Trim());
                            }
                            
    else if (reader.Name == "MoveRightKey")
                            {
                                _moveRightKey 
    = (Keys)Convert.ToInt32(reader.ReadElementString().Trim());
                            }
                            
    else if (reader.Name == "DeasilRotateKey")
                            {
                                _deasilRotateKey 
    = (Keys)Convert.ToInt32(reader.ReadElementString().Trim());
                            }
                            
    else if (reader.Name == "ContraRotateKey")
                            {
                                _contraRotateKey 
    = (Keys)Convert.ToInt32(reader.ReadElementString().Trim());
                            }
                            
    else if (reader.Name == "CoorWidth")
                            {
                                coorWidth 
    = Convert.ToInt32(reader.ReadElementString().Trim());
                            }
                            
    else if (reader.Name == "CoorHeight")
                            {
                                coorHight 
    = Convert.ToInt32(reader.ReadElementString().Trim());
                            }
                            
    else if (reader.Name == "RectPix")
                            {
                                rectPix 
    = Convert.ToInt32(reader.ReadElementString().Trim());
                            }
                            
    else if (reader.Name == "BackColor")
                            {
                                _backColor 
    =Color.FromArgb(Convert.ToInt32(reader.ReadElementString().Trim()));
                            }
                        }
                    }
                }
                
    catch (Exception ex)
                {

                    MessageBox.Show(ex.Message);
                }
                
    finally
                {
                    
    if(reader!=null)
                    {
                        reader.Close();
                    }
                }
            }
     

     另一种方法:

    代码
    //用ResourceManager将资源读出.  
    Assembly   myAssem   =   Assembly.GetEntryAssembly();  

    ResourceManager   rm   
    =   new   ResourceManager("TheAresAdoNet.TheAres");  
    //TheAresAdoNet   是你程序的命名空间,TheAres是TheAres.resources  
    this.pictureBox1.Image   =   (Image)rm.GetObject("MyLogo");  
    this.Text   =   rm.GetString("Title");  

  • 相关阅读:
    android studio学习----Android Studio导入github下载的工程--替换方法
    python+selenium 发送邮件
    vue 操作列的自定义
    vue作用域插槽实践
    vue左侧菜单的实现
    Django 解决跨域
    关于 with 语句
    docker
    python连接 ssh
    数据库建表 外键
  • 原文地址:https://www.cnblogs.com/millen/p/1931659.html
Copyright © 2011-2022 走看看