浪漫的周末从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. Java Socket网络编程常见异常(转)

    1.java.net.SocketTimeoutException 这个异常比较常见,socket超时.一般有2个地方会抛出这个,一个是connect的时候,这个超时参数由connect(Socket ...

  2. iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式

    iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式 说明: 1)该文简短介绍在iOS开发中遍历字典.数组和集合的几种常见方式. 2)该文对应的代码可以在下面的地址获得:https:// ...

  3. Android视觉规范-间距规范与文字规范单位换算(dip、sp与px)

    http://blog.csdn.net/shimiso/article/details/29826073 1.dip与px Android工程师在写页面时,margin值的单位是dip,而视觉设计师 ...

  4. asp.net MVC的EF与easyui DataGrid数据绑定

    页面代码 @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewpor ...

  5. const成员函数

    尽管函数名和参数列表都相同,void foo( ) const成员函数是可以与void foo( )并存的,可以形成重载! 我们假设调用语句为obj.foo(),如果obj为non-const对象,则 ...

  6. RTL8710 Flasher

    https://bitbucket.org/rebane/rtl8710_openocd/ rtl8710_openocd / script / rtl8710.ocd # # OpenOCD scr ...

  7. atmega32u4制作arduino leonardo最小系统

    转载请注明:@小五义http://www.cnblogs.com/xiaowuyiQQ群:64770604 一.leonardo最小系统 关于leonardo这里不再介绍,直接上最小系统原理图,该系统 ...

  8. [C++] zlatlcv: ATL字符串转换辅助库。能很方便的将UTF-8字符串转为TCHAR等字符串

    作者:zyl910 如今,UTF-8字符串的使用频率越来越多了.但是在VC中,不能直接处理UTF-8字符串,得专门去写UTF-8与窄字符串.宽字符串.TCHAR字符串相互转换的代码.不仅费时费力,而且 ...

  9. javaweb 学习总结

    http://www.cnblogs.com/xdp-gacl/category/574705.html 这个总结很好,以前看书没搞懂的,这里基本上都清楚了,赞一个,推荐. Servlet与普通Jav ...

  10. Spectrum to XYZ to sRGB

    如何将频谱响应转换为对应的RGB显示值: 首先要在频率功率分布(SPD)曲线的基础上,分别使用X/Y/Z三个频率匹配曲线(spectral matching curves,又名CIE XYZ Colo ...