浪漫的周末从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. php: zend server 安装及相关配置

    运行安装文件(ZendServer-CE-php-5.3.2-5.0.1-Windows_x86.exe)开始安装,选项请参照我的选择. 这里不做改动,维持默认选择即可 点击Browse按钮更改安装目 ...

  2. 使用ThreadPool代替Thread

    线程的空间开销 线程内核对象.包含上下文信息.32位系统占用700字节 线程环境块.包括线程的异常处理链.32位系统占用4KB 用户模式栈.保存方法的参数.局部变量和返回值 内核模式栈.调用操作系统的 ...

  3. Java 周历日历

    WeekCalendarUtils工具类代码,传入起始日期即可返回对应日期的周历日历,年月部分添加周数统计 import java.util.Calendar; import java.util.Da ...

  4. C#控制其它程序

    [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]        ...

  5. Android 组件系列-----Activity的传值和回传值

    在这篇随笔里将讲解Activity的传值和回传值. 一.通过startActivity来进行Activity的传值 在Android中,如果我们要通过一个Activity来启动另一个Activity, ...

  6. Web service standards: SOAP, REST, OData, and more

    Web service standards: SOAP, REST, OData, and more So far, we've covered the components of a web ser ...

  7. vlc android 移植版编译

    同步发表于http://avenwu.net/2015/07/27/vlc-android-compiling 安装必备工具/解决环境问题 环境准备什么的如果没配置过需要一步步配置,主要是sdk/nd ...

  8. CentOS 6.5 EasyPR环境搭建

    EasyPR是一款开源的中文车牌识别系统,项目地址. 在搭建的过程中,主要的问题是注意版本的兼容性,这里面的版本包括:opencv版本,g++版本以及cmake版本. 我使用的EasyPr版本信息如下 ...

  9. 2016年象行中国(上海站)圆满结束,会议PPT分享

    2016年象行中国(上海站)已于5-21日圆满结束,所有技术交流的文档和PPT经整理后,现集中存放在云盘中,相关议题如下:     DeepGreen-LLVM-Intro.pptx ... 1.1M ...

  10. Android杂谈--HTC等手机接收不到UDP广播报文的解决方案

    最近遇到个问题,在android手机上发送UDP报文的时候,HTC等机型(测试用HTC new one)接收不到广播报文,而其他的samsung, huawei, xiaomi, nexus等等均没有 ...