浪漫的周末从cnblogs开始。话说,今天和往常的周末一样,韩君躲在被窝里用手机翻阅着园子里的珠玑。一篇《应用XML作为数据库的快速开发框架》的文章在韩君脑子里激起了一波球形闪电。想想上周中刚好完成的一个WinCE小项目,这波久久不能平息。韩君做了一个比马兄更艰难的决定,秒速穿戴衣裤后,开始了那第N次的亲密接触...

成果:

一个外传版的XML数据源快速开发框架:XmlFramwork。

PathRoute:路由XML数据文件路径;

List<T>:XML实体类的泛型集合,对应XML文档;

ListExtend:为List<T>扩展将实体类集合序列化为XML文档及将XML文档反序列化为实体类集合的方法;

XmlEntity:XML实体类的基类,定义了一个Guid类型的属性(ID);

XmlEntityProcess:对Xml文档进行增、删、改、查等处理。

框架源码:

PathRoute.cs

/* 

 类:PathRoute

 描述:路由XML数据文件路径

 编 码 人:韩兆新 日期:2014年12月21日


 修改记录:


*/

using System.Configuration;

using System.IO;

using System.Reflection;

 

namespace XmlFramwork

{

    static class PathRoute

    {

        public static readonly string DataFolder = ConfigurationManager.AppSettings["DataFolder"];

        public static string GetXmlPath<T>()

        {

            string dataFolder = DataFolder;

            if (string.IsNullOrEmpty(dataFolder))

            {

                dataFolder = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Data");

            }

            return Path.ChangeExtension(Path.Combine(dataFolder, Path.Combine(typeof(T).FullName.Split('.'))), ".xml");

        }

    }

}

ListExtend.cs

/* 

 类:ListExtend

 描述:为List<T>扩展加载XML文档和保存为XML文档的方法

 编 码 人:韩兆新 日期:2014年12月21日


 修改记录:


*/

using System.Collections.Generic;

using System.IO;

using System.Xml.Serialization;

 

namespace XmlFramwork

{

    public static class ListExtend

    {

        /// <summary>

        /// 加载XML文档返回List集合

        /// </summary>

        /// <typeparam name="TSource"></typeparam>

        /// <param name="source"></param>

        /// <returns></returns>

        public static List<TSource> Load<TSource>(this List<TSource> source)

        {

            string fileName = PathRoute.GetXmlPath<TSource>();

            if (File.Exists(fileName))

            {

                XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<TSource>));

                using (Stream reader = new FileStream(fileName, FileMode.Open, FileAccess.Read))

                {

                    return xmlSerializer.Deserialize(reader) as List<TSource>;

                }

            }

            else

            {

                return new List<TSource>();

            }

        }

        /// <summary>

        /// 将list集合保存为XML文档

        /// </summary>

        /// <typeparam name="TSource"></typeparam>

        /// <param name="source"></param>

        public static void Save<TSource>(this List<TSource> source)

        {

            string fileName = PathRoute.GetXmlPath<TSource>();

            FileInfo fileInfo = new FileInfo(fileName);

            DirectoryInfo directoryInfo = fileInfo.Directory;

            if (!directoryInfo.Exists)

            {

                directoryInfo.Create();

            }

            XmlSerializer xmlSerializer = new XmlSerializer(source.GetType());

            using (Stream writer = new FileStream(fileName, FileMode.Create, FileAccess.Write))

            {

                xmlSerializer.Serialize(writer, source);

            }

        }

    }

}

XmlEntity.cs

/* 

 类:XmlEntity

 描述:Xml实体类基类

 编 码 人:韩兆新 日期:2014年12月21日


 修改记录:


*/

using System;

 

namespace XmlFramwork

{

    public class XmlEntity

    {

        public Guid ID{ set; get;}

    }

}

XmlEntityProcess.cs

/* 

 类:XmlEntityProcess〈T〉

 描述:对Xml文档进行增、删、改、查等处理

 编 码 人:韩兆新 日期:2014年12月21日


 修改记录:


*/

using System;

using System.Collections.Generic;

using System.Linq;

 

namespace XmlFramwork

{

    public static class XmlEntityProcess<T> where T : XmlEntity

    {

        private static string lastErrMsg;

        /// <summary>

        /// 获取最后一次错误的信息

        /// </summary>

        /// <returns></returns>

        public static string GetLastErrMsg()

        {

            return lastErrMsg;

        }

        /// <summary>

        /// 插入XML实体类对象

        /// </summary>

        /// <param name="entity"></param>

        /// <returns></returns>

        public static bool Insert(T entity)

        {

            try

            {

                List<T> entityList = new List<T>().Load();

                entity.ID = Guid.NewGuid();

                entityList.Add(entity);

                entityList.Save();

                return true;

            }

            catch (Exception ex)

            {

                lastErrMsg = ex.Message;

                return false;

            }

        }

        /// <summary>

        /// 根据ID删除XML实体类对象

        /// </summary>

        /// <param name="id"></param>

        /// <returns></returns>

        public static bool DeleteById(Guid id)

        {

            try

            {

                List<T> entityList = new List<T>().Load();

                entityList = entityList.Where(entity => entity.ID != id).ToList();

                entityList.Save();

                return true;

            }

            catch (Exception ex)

            {

                lastErrMsg = ex.Message;

                return false;

            }

        }

        /// <summary>

        /// 更新XML实体类对象

        /// </summary>

        /// <param name="entity"></param>

        /// <returns></returns>

        public static bool Update(T entity)

        {

            try

            {

                List<T> entityList = new List<T>().Load();

                entityList = entityList.Where(e => e.ID != entity.ID).ToList();

                entityList.Add(entity);

                entityList.Save();

 

                return true;

            }

            catch (Exception ex)

            {

                lastErrMsg = ex.Message;

                return false;

            }

        }

        /// <summary>

        /// 获取所有的指定类型的XML实体类对象

        /// </summary>

        /// <returns></returns>

        public static List<T> GetAll()

        {

            try

            {

                List<T> entityList = new List<T>().Load();

                return entityList;

            }

            catch (Exception ex)

            {

                lastErrMsg = ex.Message;

                return null;

            }

 

        }

        /// <summary>

        /// 根据ID获取指定类型的XML实体类对象

        /// </summary>

        /// <param name="id"></param>

        /// <returns></returns>

        public static T GetById(Guid id)

        {

            try

            {

                List<T> entityList = new List<T>().Load();

                entityList = entityList.Where(e => e.ID == id).ToList();

                if (null == entityList || entityList.Count <= 0)

                {

                    return default(T);

                }

                else

                {

                    return entityList[0];

                }

            }

            catch (Exception ex)

            {

                lastErrMsg = ex.Message;

                return null;

            }

        }

    }

}

框架演示实例:

界面:

DemoForm.cs

/* 

 类:DemoForm

 描述:XmlFramwork增、删、改、查演示

 编 码 人:韩兆新 日期:2014年12月21日


 修改记录:


*/

using System;

using System.Collections.Generic;

using System.Windows.Forms;

using XmlFramwork;

using XmlFramworkDemo.Entity;

using XmlFramworkDemo.Urility;

 

namespace XmlFramworkDemo

{

    public partial class DemoForm : Form

    {

        public DemoForm()

        {

            InitializeComponent();

        }

        /// <summary>

        /// DemoForm窗口——加载

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void DemoForm_Load(object sender, EventArgs e)

        {

            BindGvUserInfo();

        }

        /// <summary>

        /// 添加、修改按钮——单击

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void btnOperation_Click(object sender, EventArgs e)

        {

            if (string.IsNullOrEmpty(txtName.Text))

            {

                MessageBox.Show("请输入姓名!");

                return;

            }

            if (string.IsNullOrEmpty(txtAge.Text))

            {

                MessageBox.Show("请输入年龄!");

                return;

            }

            else if(!ValidateHelper.IsValidUintFormat(txtAge.Text.Trim()))

            {

                MessageBox.Show("年龄不是合法的格式!");

                return;

            }

            if (btnOperation.Text.Equals("添加"))

            {

                UserInfo userInfo = new UserInfo();

                userInfo.Age = uint.Parse(txtAge.Text.Trim());

                userInfo.Name = txtName.Text;

                if (!XmlEntityProcess<UserInfo>.Insert(userInfo))

                {

                    MessageBox.Show("插入失败:" + XmlEntityProcess<UserInfo>.GetLastErrMsg());

                }

            }

            else

            {

                UserInfo userInfo = btnOperation.Tag as UserInfo;

                userInfo.Name = txtName.Text;

                userInfo.Age = uint.Parse(txtAge.Text.Trim());

                if (!XmlEntityProcess<UserInfo>.Update(userInfo))

                {

                    MessageBox.Show("更新失败:" + XmlEntityProcess<UserInfo>.GetLastErrMsg());

                }

            }

            btnOperation.Text = "添加";

            BindGvUserInfo();

        }

        /// <summary>

        /// 编辑菜单——单击

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void 编辑ToolStripMenuItem_Click(object sender, EventArgs e)

        {

            Guid id =Guid.Parse(gvUserInfo.SelectedRows[0].Cells["ID"].Value.ToString());

            UserInfo userInfo = XmlEntityProcess<UserInfo>.GetById(id);

            txtName.Text = userInfo.Name;

            txtAge.Text = userInfo.Age.ToString();

            btnOperation.Tag = userInfo;

            btnOperation.Text = "修改";

        }

        /// <summary>

        /// 删除菜单——单击

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void 删除ToolStripMenuItem_Click(object sender, EventArgs e)

        {

            Guid id = Guid.Parse(gvUserInfo.SelectedRows[0].Cells["ID"].Value.ToString());

            XmlEntityProcess<UserInfo>.DeleteById(id);

            BindGvUserInfo();

        }

        /// <summary>

        /// 查询按钮——单击

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void 查询ToolStripMenuItem_Click(object sender, EventArgs e)

        {

            Guid id =Guid.Parse(gvUserInfo.SelectedRows[0].Cells["ID"].Value.ToString());

            UserInfo userInfo = XmlEntityProcess<UserInfo>.GetById(id);

            txtName.Text = userInfo.Name;

            txtAge.Text = userInfo.Age.ToString();

        }

        

        /// <summary>

        /// 右键菜单

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void gvUserInfo_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)

        {

            if (e.ColumnIndex < 0 || e.RowIndex < 0)

            {

                return;

            }

            if (e.Button == MouseButtons.Right)

            {

                if (e.RowIndex >= 0)

                {

                    //若行已是选中状态就不再进行设置

                    if (gvUserInfo.Rows[e.RowIndex].Selected == false)

                    {

                        gvUserInfo.ClearSelection();

                        gvUserInfo.Rows[e.RowIndex].Selected = true;

                    }

                    //只选中一行时设置活动单元格

                    if (gvUserInfo.SelectedRows.Count == 1)

                    {

                        gvUserInfo.CurrentCell = gvUserInfo.Rows[e.RowIndex].Cells[e.ColumnIndex];

                    }

                    //弹出操作菜单

                    contextMenuStrip1.Show(MousePosition.X, MousePosition.Y);

                }

            }

        }

 

        /// <summary>

        /// 绑定GvUserInfo

        /// </summary>

        private void BindGvUserInfo()

        {

            List<UserInfo> userInfoList = XmlEntityProcess<UserInfo>.GetAll();

            if (null != userInfoList)

            {

                gvUserInfo.DataSource = userInfoList;

            }

            else

            {

                MessageBox.Show("获取数据失败:" + XmlEntityProcess<UserInfo>.GetLastErrMsg());

            }

        }

 

    }

}

UserInfo.cs

/* 

 类:UserInfo

 描述:XML实体类UserInfo

 编 码 人:韩兆新 日期:2014年12月21日


 修改记录:


*/

using XmlFramwork;

 

namespace XmlFramworkDemo.Entity

{

    public class UserInfo:XmlEntity

    {

        public string Name { set; get; }

        public uint Age { set; get; }

    }

}

ValidateHelper.cs

/* 

 类:ValidateHelper

 描述:用于字符串格式验证

 编 码 人:韩兆新 日期:2014年12月21日


 修改记录:


*/

using System;

 

namespace XmlFramworkDemo.Urility

{

    public static class ValidateHelper

    {

        public static bool IsValidUintFormat(string strIn)

        {

            uint temp;

            return UInt32.TryParse(strIn,out temp);

        }

    }

}

App.config

源码下载:

XmlFramwork源码及演示.zip

XML数据源快速开发框架——XmlFramwork的更多相关文章

  1. FastFrameWork 快速开发框架

    前言 FastFrameWork 快速开发框架是一款基于敏捷并行开发思想和Microsoft .Net构件(插件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市场快速变化的 ...

  2. spring-boot-plus后台快速开发框架1.0.0.RELEASE发布了

    spring-boot-plus spring-boot-plus是一套集成spring boot常用开发组件的后台快速开发框架 官网地址:springboot.plus GITHUB:https:/ ...

  3. 集成 Spring Boot 常用组件的后台快速开发框架 spring-boot-plus 国

    spring-boot-plus是一套集成spring boot常用开发组件的后台快速开发框架 Purpose 每个人都可以独立.快速.高效地开发项目! Everyone can develop pr ...

  4. CRL快速开发框架系列教程十(导出对象结构)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  5. CRL快速开发框架开源完全转到Github

    CRL简介 CRL是一款面向对象的轻量级ORM框架,本着快速开发,使用简便的原则,设计为 无需关心数据库结构,CRL自动维护创建,即写即用(CRL内部有表结构检查机制,保证表结构一致性) 无需第三方工 ...

  6. CRL快速开发框架升级到3.1

    CRL是一款面向对象的轻量级ORM框架,本着快速开发,使用简便的原则,设计为 无需关心数据库结构,CRL自动维护创建,即写即用(CRL内部有表结构检查机制,保证表结构一致性) 无需第三方工具生成代理类 ...

  7. AndroidAnnotations(Code Diet)android快速开发框架

    最近用了一款很不错的android快速开发框架,1000行的代码瞬间变成几百行,不用你会后悔的 特点: (1) 依赖注入:包括view,extras,系统服务,资源等等(2) 简单的线程模型,通过an ...

  8. [原] Android快速开发框架-AndroidFine,GitHub开源

    Android快速开发框架 UI组件,不止是简单整合,更易用 沉浸式状态栏,界面更漂亮 左滑返回,非常流畅 简单.可复用.易扩展的底部导航 PagerSlidingTabStrip,导航标签文字颜色和 ...

  9. GZFramwork快速开发框架演练之会员系统(四)添加商品管理

    1.1:创建表结构 新建三张商品关联的表,表模型如下: 创建SQL语句略 1.2:生成表Model(生成方法见上一节) 1.3:生成tb_ProductType的单结构界面然后添加到项目中 1.4:修 ...

随机推荐

  1. Ubuntu14.04.1 阿里apt源

    deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiversedeb http://mirrors.a ...

  2. JQ例子:旋转木马

    使用JQ现实旋转木马超级简单,它看起来很复杂,动画好像很难实现,但其实不然. 效果图: <!DOCTYPE html> <html lang="en"> & ...

  3. CentOS7安装mysql数据库

    安装完Centos7,迫不急待的想安装mysql数据库,却没想到走了很多弯路,后来经过查资料,才知道了在Centos7中用MariaDB代替了mysql数据库. 准确来说,本文的标题有点误导的意思,本 ...

  4. 三、oracle 体系结构

    1.oracle内存由SGA+PGA所构成 2.oracle数据库体系结构数据库的体系结构是指数据库的组成.工作过程与原理,以及数据在数据库中的组织与管理机制. oracle工作原理: 1).在数据库 ...

  5. js 去掉字符串前面的0

    <script>var a='00123';alert(a.replace(/\b(0+)/gi,""));</script>

  6. webpack 打包时到底如何组织js

    问题一:引入前端库,方法也是不一样的 比如 lodash.js ,作为一个 chunk 用 html-webpack-plugin 打包到页面里,会生成一个全局变量 window._ ,在其它 js ...

  7. 命令行上的narrowing(随着输入逐步减少备选项)工具

    前面在介绍zsh的时候,说过它的补全用来起比bash的Tab补全方便多了,在有多个备选项是你只要用光标键来挑选就是了,而不是全列出来提示你再多输入几个字符.而Emacs的anything / helm ...

  8. EclEmma的介绍、安装与使用

    p{line-height: 200%}   1. EclEmma的介绍   EclEmma是一个开源的软件测试工具,可以在编码过程中查看代码调用情况.也可以检测单覆盖率.   2. Eclipse下 ...

  9. 搬家至个人独立博客virson.cn

    最近正在将博客园的文章搬到自己的独立博客,以后基本上不会在博客园更新文章了,欢迎光临我的新博客:www.virson.cn,博客内容持续更新中……

  10. PlayFramework 1.2.x 在Controller 中识别JSON提交

    链接 http://stackoverflow.com/questions/6132892/consuming-json-in-play-framework-controller @Global pu ...