关闭

(原创) 简单的用反射机制读取XML并以树状显示

674人阅读 评论(0) 收藏 举报
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Xml;

namespace XMLTest
{
    
/// <summary>
    
/// Form1 的摘要说明。
    
/// </summary>

    public class Form1 : System.Windows.Forms.Form
    
{
        XmlDocument xmldoc;     
//文档对象
        XmlElement element;        //元素
        System.Xml.XmlNodeList list;  //节点列表.   
//        System.Xml.XmlNode TEMP;

        
private System.Windows.Forms.Button button1;
        
private System.Windows.Forms.RichTextBox info;
        
private System.Windows.Forms.TreeView treeView1;
        
private System.Windows.Forms.TextBox tb_name;
        
private System.Windows.Forms.TextBox tb_age;
        
private System.Windows.Forms.Label label1;
        
private System.Windows.Forms.Label label2;
        
private System.Windows.Forms.Label label3;
        
private System.Windows.Forms.Button button2;
        
/// <summary>
        
/// 必需的设计器变量。
        
/// </summary>

        private System.ComponentModel.Container components = null;

        
public Form1()
        
{
            
//
            
// Windows 窗体设计器支持所必需的
            
//
            InitializeComponent();
            
//
            
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
            
//
        }


        
/// <summary>
        
/// 清理所有正在使用的资源。
        
/// </summary>

        protected override void Dispose( bool disposing )
        
{
            
if( disposing )
            
{
                
if (components != null
                
{
                    components.Dispose();
                }

            }

            
base.Dispose( disposing );
        }


        
Windows 窗体设计器生成的代码

        
/// <summary>
        
/// 应用程序的主入口点。
        
/// </summary>

        [STAThread]
        
static void Main()
        
{
            Application.Run(
new Form1());
        }


        
private void button1_Click(object sender, System.EventArgs e)
        
{
            System.Reflection.Assembly assemly
=typeof(Form1).Assembly;        //使用反射机制获取一个流,这个流当中包含了要读取的XML文档
            xmldoc=new XmlDocument();
           xmldoc.Load(assemly.GetManifestResourceStream(
"XMLTest.XmlTest.Xml"));                                                                            //用流读取XML文档(路径: XMLTest[工程名].XmlTest.Xml[文件名]).其实该XML文件                                                            //在编译时候就被集成进EXE文件中,读取的时候就要利用反射以流的方式读取出该文件
            element=xmldoc.DocumentElement;        //得到文档的根节点.
            list=element.ChildNodes;                             //然后得到根节点下所有子节点,作为一数组.
            TreeNode n=new TreeNode(xmldoc.DocumentElement.Name);
                          //TreeNode (treeView的节点),内添加一XML根节点的名称作为TreeNode的根节点
            foreach(System.Xml.XmlNode TEMP in list){      
                XmlElement element1
=(XmlElement)TEMP;
                                                                     // 得到节点数组中的所有节点,并依次另存为XML元素
                TreeNode nn=new TreeNode(element1.GetAttribute("id")); 
                                                                  
//得到XML元素属性值,作为标志放进TreeNode里作为子节点
              n.Nodes.Add(nn);              
            }

            treeView1.Nodes.Add(n);                                                   
//然后最终添加到treeView控件中.
        }


        
private void treeView1_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
        
{
            
try
            
{
                
if(treeView1.SelectedNode.Parent!=null)        //(以下动作在鼠标选中的节点不是根节点的前提下有效)
                {
                    TreeNode node
=treeView1.SelectedNode;  //得到鼠标当前选中的节点
                    string nodetxt=node.Text; //节点名
                    foreach(System.Xml.XmlNode TEMP in list)  
                    
{                                                                      //逐个比较该节点名与XmlNodeList中各元素名
                        XmlElement element1=(XmlElement)TEMP;       
                        
if(nodetxt.Equals(element1.GetAttribute("id"))) 
                        
{
                            XmlNodeList nl
=element1.ChildNodes;    
                                                 //若匹配,则取出当前节点下面的所有子项,分别显示出来
                            XmlNode selectednode=nl.Item(0);
                            tb_name.Text
=selectednode.InnerXml;
                            selectednode
=nl.Item(1);
                            tb_age.Text
=selectednode.InnerXml;
                            selectednode
=nl.Item(2);
                            info.Text
=selectednode.InnerXml;
                        }

                    }

                }

            }

            
catch(Exception eeeeee){
                MessageBox.Show(
this,"所读取的XML文件有错误. 请检查错误信息: "+eeeeee.Message,"错误",MessageBoxButtons.OK,MessageBoxIcon.Error);
              }

            }


        
private void Form1_Load(object sender, System.EventArgs e)
        
{
        
        }


        
private void button2_Click(object sender, System.EventArgs e)
        
{
            Application.Exit();
        }



        
private void Keydown(object sender, System.Windows.Forms.KeyPressEventArgs e)
        
{
            
            
        }


        
private void button2_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e)
        
{
        }


        
private void Form1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
        
{
        }

    }

}

 

 

*********************以下是原XML文件的内容********************

<?xml version="1.0" encoding="UTF-8"?>
<!-- -->

<UsersList>
    
<User id="A393">
        
<name>Tom</name>
        
<Age>18</Age>
        
<info>T28BG19672HU1ILP328913B281</info>
    
</User>
    
<User id="R194">
        
<name>Jerry</name>
        
<Age>19</Age>
        
<info>T28BG196R28391F2F2944V1892</info>
    
</User>
    
<User id="S102">
        
<name>Linda</name>
        
<Age>17</Age>
        
<info>T28BVG27K10383H2SW19L32193</info>
    
</User>
    
<User id="A411">
        
<name>David</name>
        
<Age>20</Age>
        
<info>T28BHJ400JB4967110CVR08L99</info>
    
</User>
    
<User id="A996">
        
<name>Lucy</name>
        
<Age>18</Age>
        
<info>T28BG30185015224MYO10GL9P2</info>
    
</User>
    
<User id="M183">
        
<name>June</name>
        
<Age>18</Age>
        
<info>T28F92118TTG62114F5X211033</info>
    
</User>
</UsersList>

 

时间仓促, 我就不太按规范写了.

不过请大家注意!  反射机制可是需要牺牲一定的性能的!...

 

 xmldoc=new XmlDocument();
           xmldoc.Load(可以是文件名或包含XML文档的流
);    

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:16766次
    • 积分:271
    • 等级:
    • 排名:千里之外
    • 原创:10篇
    • 转载:1篇
    • 译文:0篇
    • 评论:5条
    文章分类
    最新评论