0

0

一个简单的基于XML的模块集成框架

黄舟

黄舟

发布时间:2017-02-28 17:04:05

|

1871人浏览过

|

来源于php中文网

原创

1. 准备一个xml文件

xmlmenu

 1
 2    
 3        
 4            
 5            
 6            
 7        
8

2.准备一个xml schemal文件来验证xml文件




    
        
            
                
            
        
    
    
        
            
                
            
            
                
                    
                        
                        
                    
                
            
            
                
                    
                        
                        
                    
                
            
            
            
                
                    
                        
                        
                    
                
            
            
            
            
                
                    
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                    
                
            
        
    

3。定义一个类来加载菜单

public class MenuLoad
    {
        PRivate PluginCollection m_plugins = null;
        public MenuBar _menbar = new MenuBar();
        public ToolStrip _toolbar = new ToolStrip();
        private OutlookBar bar = new OutlookBar();
        private ImageList imglist = new ImageList();
        private StringBuilder builder = new StringBuilder();
        public MenuLoad()
        {
            bar = _menbar.outlookBar;
        }
        private TabControl tabCtrl;
        public TabControl TabCtrl
        {
            set
            {
                tabCtrl = value;
            }
        }
        private void ValidationEventHandler(object sender, ValidationEventArgs e)
        {
            builder.AppendLine("验证XML文档的时候发生错误:");
            builder.AppendLine("严重级别:" + e.Severity);
            builder.AppendLine("错误信息:" + e.Message);
            builder.AppendLine("------+--------+-------+------+--------+-------+------+--------+-------+");
            builder.AppendLine();
        }
        /**//// 
        /// 验证XML文件是否是合乎规范的文件
        /// 
        /// 文件名称
        /// 是则返回true,否则返回false
        private bool ValidateXml(string xmlfile)
        {
            bool validXml = false;
            string spath = "";
            spath = application.StartupPath + "\\configurations\\XMLSMenu.xsd";
            if(!System.IO.File.Exists(spath))
            {
                throw new System.IO.FileNotFoundException(String.Format(Resources.StringFileNotFound, spath));
            }
            XmlReaderSettings settings = new XmlReaderSettings();
            XmlSchemaSet schemaSet = new XmlSchemaSet();
            schemaSet.Add(null, spath);
            settings.Schemas.Add(schemaSet);
            settings.ValidationType = ValidationType.Schema;
            settings.ValidationEventHandler += new ValidationEventHandler(ValidationEventHandler);
            settings.ValidationFlags = settings.ValidationFlags | XmlSchemaValidationFlags.ReportValidationWarnings;
            XmlReader reader = XmlReader.Create(xmlfile, settings);

            while(reader.Read())
            {
            }
            
            if(builder.Length > 0)
            {
                validXml = false;
            }
            else
            {
                validXml = true;
            }
            reader.Close();
            return validXml;
        }
        /**//// 
        /// 加载菜单
        /// 
        /// 主菜单
        /// 菜单定义文件
        public MainMenu LoadMenus(string xmlfile)
        {
            MainMenu mainmenu = new MainMenu();
            
            try
            {
                using(new WaitCursor())
                {
                    //验证XML是否是合乎规范的XML文件
                    if(ValidateXml(xmlfile))
                    {
                        XmlDocument document = new XmlDocument();
                        document.Load(xmlfile);
                        XmlNode rootNode = document.DocumentElement;
                        mainmenu = GetMenus(rootNode);   
                    }
                    else
                    {
                        throw new Exception(builder.ToString());
                    }
                }
            }
            catch (System.IO.FileNotFoundException)
            {
                Utility.ShowErrorMsg(String.Format(Resources.StringFileNotFound, xmlfile));
            }
            return mainmenu;
        }
        /**//// 
        /// 加载菜单
        /// 
        /// 主菜单
        /// 菜单项节点
        private MainMenu GetMenus(XmlNode node)
        {
            MainMenu mainmenu = new MainMenu();
            List nodelist= new List();
            List mnulist = new List();
            List iplist = new List();
            string menutext ="";
            //首先加载主菜单,避免迭代的时候菜单显示的过分延迟。
            foreach(XmlNode child in node.ChildNodes)
            {
                if(child.NodeType == XmlNodeType.Element && child.Name == "MenuItem")
                {
                    menutext = child.Attributes["Name"].Value;
                    OfficeMenuItem item = new OfficeMenuItem(true,menutext);
                    mainmenu.MenuItems.Add(item);
                    IconPanel cp = new IconPanel();
                    bar.AddBand(menutext, cp);
                    nodelist.Add(child);
                    mnulist.Add(item);
                    iplist.Add(cp);
                }
            }
            //加载所有的子菜单
            GetSubMenus(iplist.ToArray(),mnulist.ToArray(), nodelist.ToArray());
            return mainmenu;
        }
        /**//// 
        /// 加载所有子菜单
        /// 
        /// 主菜单集合
        /// 菜单节点集合
        private void GetSubMenus(IconPanel[] iplist ,OfficeMenuItem[] main, XmlNode[] node)
        {
            EventHandler handler = new EventHandler(OnPluginClick);
            EventHandler handler1 = new EventHandler(OnIconClick);
            EventHandler handler2 = new EventHandler(OnButtonClick);
            string asmname;
            string formtag;
            string text;
            MenuClass mc;
            XmlNode child;
            string iconpath = "";
            string iconname = "";
            string msc = "";
            for(int i = 0; i <= main.GetUpperBound(0); i++)
            {
                //foreach(XmlNode child in node[i].ChildNodes)
                for(int j = 0; j < node[i].ChildNodes.Count;j++ )
                {
                    child = node[i].ChildNodes[j];
                    if(child.NodeType == XmlNodeType.Element && child.Name == "MenuItem")
                    {
                        asmname = child.Attributes["AssemblyName"].Value;
                        formtag = child.Attributes["FormTag"].Value;
                        text = child.Attributes["Name"].Value;
                        msc = child.Attributes["ShortCut"].Value;
                        OfficeMenuItem item = new OfficeMenuItem(true, text, handler);
                        iconname = child.Attributes["Image"].Value;
                        if(iconname != string.Empty)
                        {
                            iconpath = Themes.GetCurrentThemePath() +iconname;
                            item.IconPath = iconpath;
                            
                        } 
                        mc = new MenuClass();
                        mc.Assemblyname = asmname;
                        mc.FormTag = formtag;
                        item.Tag = mc;
                        if(msc != string.Empty)
                        {
                            item.Shortcut = MenuShortCut.GetShortCut(msc);
                        }
                        main[i].MenuItems.Add(item);
                        if((iconpath != string.Empty) && System.IO.File.Exists(iconpath))
                        {    //添加按钮到OutlookBar                        
                            PanelIcon picon = iplist[i].AddIcon(item.Text,Image.FromFile(iconpath),handler1);
                            picon.Tag = mc;
                            //添加按钮到toolbar
                            ToolStripButton button = new ToolStripButton(item.Text, Image.FromFile(iconpath), handler2);
                            button.DisplayStyle = ToolStripItemDisplayStyle.Image;
                            button.ToolTipText = item.Text;
                            button.Tag = mc;
                            button.Visible = true;
                            _toolbar.Items.Add(button);
                        }
                        iconpath = "";
                        mc = null;
                        if(child.ChildNodes.Count > 0)
                        {
                            GetChildMenu(iplist[i],item, child);
                        }
                    }
                }
                //添加分割线
                ToolStripSeparator ss = new ToolStripSeparator();
                _toolbar.Items.Add(ss);
            }
        }
        /**//// 
        /// 加载子菜单
        /// 
        /// 父菜单
        /// 父菜单定义XML节点
        private void GetChildMenu(IconPanel ip,OfficeMenuItem parent, XmlNode node)
        {
            EventHandler handler = new EventHandler(OnPluginClick);
            EventHandler handler1 = new EventHandler(OnIconClick);
            EventHandler handler2 = new EventHandler(OnButtonClick);
            MenuClass mc;
            string asmname;
            string formtag;
            string text;
            XmlNode child1;
            string iconpath = "";
            string iconname = "";
            string msc = "";
            //foreach(XmlNode child1 in node.ChildNodes)
            for(int i = 0; i < node.ChildNodes.Count - 1;i++ )
            {
                child1 = node.ChildNodes[i];
                //检查是否提供了类型
                asmname = child1.Attributes["AssemblyName"].Value;
                formtag = child1.Attributes["FormTag"].Value;
                text = child1.Attributes["Name"].Value;
                OfficeMenuItem childitem;
                childitem = new OfficeMenuItem(true, text, handler);
                childitem.Name = text;
                mc = new MenuClass();
                mc.Assemblyname = asmname;
                mc.FormTag = formtag;
                
                childitem.Tag = mc;
                //添加快捷键
                msc = child1.Attributes["ShortCut"].Value;
                if(msc != string.Empty)
                {
                    childitem.Shortcut = MenuShortCut.GetShortCut(msc);
                }
                //添加图标
                iconname = child1.Attributes["Image"].Value;
                if(iconname != string.Empty)
                {
                    iconpath = Themes.GetCurrentThemePath() + iconname;
                    childitem.IconPath = iconpath;
                }
                parent.MenuItems.Add(childitem);
                if((iconpath != string.Empty) && System.IO.File.Exists(iconpath))
                {    //添加按钮到OutlookBar                        
                    PanelIcon picon = ip.AddIcon(childitem.Text, Image.FromFile(iconpath), handler1);
                    picon.Tag = mc;
                    //添加按钮到toolbar
                    ToolStripButton button = new ToolStripButton(childitem.Text, Image.FromFile(iconpath), handler2);
                    button.DisplayStyle = ToolStripItemDisplayStyle.Image;
                    button.ToolTipText = childitem.Text;
                    button.Tag = mc;
                    button.Visible = true;
                    _toolbar.Items.Add(button);
                }
                iconpath = "";
                mc = null;
                if(child1.ChildNodes.Count > 0)
                {
                    GetChildMenu(ip,childitem, child1);
                }
            }
        }
        /**//// 
        /// 打开一个窗体
        /// 
        /// 窗体类程序集和窗体类的组合,从节点的AssemblyName属性获取
        private  void OpenForm(MenuClass mc)
        {
            string asmname = mc.Assemblyname;
            string formtag = mc.FormTag;
            if (formtag == "")
            {
                throw new Exception(Resources.StringNoFormFlag);
            }
            if(formtag.ToUpper() == "TRUE")
            {
                if(asmname == string.Empty)
                {
                    throw new NullReferenceException(Resources.StringAssemblyNull);
                }

                //string[] a = asmname.Split(',');
                object obj = null;
                Type tp = Type.GetType(asmname);
                if(tp != null)
                {
                    obj = Activator.CreateInstance(tp);
                }
                else
                {
                    throw new Exception("加载程序的时候出错,请检查程序(dll,exe)是否存在或者类型是否正确。");
                }

                //检查是否是Form类
                if((obj == null) | !(obj is Form))
                {
                    throw new Exception(Resources.StringNotForm);
                }
                Form frm = (obj as Form);
                //检查打开的第一个窗口是否是MDIFORM
                if(Application.OpenForms[0].IsMdiContainer)
                {
                    //作为MDICHILDFORM
                    frm.MdiParent = Application.OpenForms[0];
                }
                //加载窗体
                frm.Show();

            }
        }
        /**//// 
        /// 菜单单击事件
        /// 
        /// 
        /// 
        private void OnPluginClick(object sender, EventArgs args)
        {
            OfficeMenuItem item = (OfficeMenuItem)sender;
            MenuClass mc = (MenuClass) item.Tag;
            if ((item.Text == "退出") | (item.Text == "EXIT"))
            {
                OnExitClick(sender, args);
                return;
            }
            OpenForm(mc);
        }
    }

这里面用到了delegate,最重要的函数是加载菜单的函数和OnPluginClick函数。

去日租网站系统
去日租网站系统

去日租程序是一款具有强大的功能的基于.NET+SQL2000+AJAX构架的房屋出租管理系统。 日租网站管理系统,采用ASP.NET2.0语言开发,它集成租房模块、文章模块、订单模块、邮箱短信模块、用户模板、SEO优化模块、房间模块、支付模块等多项强大功能。系统有多年经验的高级工程师采用三层架构开发,页面代码全部采用DIV+CSS,完全符合SEO标准,有利于搜索引擎关键排名优化。日租网站

下载

使用这个框架可以动态增加任意的层次的模块。

微软的CAB 使用Resigster site方式来增加模块,感觉不是很方便。

 以上就是一个简单的基于XML的模块集成框架的内容,更多相关内容请关注PHP中文网(www.php.cn)!

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

70

2026.01.23

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

73

2026.01.23

yy漫画官方登录入口地址合集
yy漫画官方登录入口地址合集

本专题整合了yy漫画入口相关合集,阅读专题下面的文章了解更多详细内容。

298

2026.01.23

漫蛙最新入口地址汇总2026
漫蛙最新入口地址汇总2026

本专题整合了漫蛙最新入口地址大全,阅读专题下面的文章了解更多详细内容。

471

2026.01.23

C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

17

2026.01.23

php远程文件教程合集
php远程文件教程合集

本专题整合了php远程文件相关教程,阅读专题下面的文章了解更多详细内容。

114

2026.01.22

PHP后端开发相关内容汇总
PHP后端开发相关内容汇总

本专题整合了PHP后端开发相关内容,阅读专题下面的文章了解更多详细内容。

79

2026.01.22

php会话教程合集
php会话教程合集

本专题整合了php会话教程相关合集,阅读专题下面的文章了解更多详细内容。

94

2026.01.22

宝塔PHP8.4相关教程汇总
宝塔PHP8.4相关教程汇总

本专题整合了宝塔PHP8.4相关教程,阅读专题下面的文章了解更多详细内容。

74

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
XML教程
XML教程

共142课时 | 5.8万人学习

XQuery 教程
XQuery 教程

共12课时 | 3.7万人学习

XLink  教程
XLink 教程

共7课时 | 1.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号