浪漫的周末从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. 使用HTML5的File实现base64和图片的互转

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. C++/Php/Python/Shell 程序按行读取文件或者控制台

    写程序经常需要用到从文件或者标准输入中按行读取信息,这里汇总一下.方便使用 1. C++ 读取文件 #include<stdio.h> #include<string.h> i ...

  3. Tomcat远程调试

    1.如果tomcat在Windows下 打开%CATALINE_HOME%/bin下的文件catalina.bat,加入下面这行: set CATALINA_OPTS=-server -Xdebug ...

  4. PHOTOSHOP CC 2015插件安装方法

    收到很多评论说不能安装.抱歉,这里解释一下,不是所有插件都能用这个方法,安装不了的只能等插件更新了,这里只是给大家一个尝试的方法,有一些插件可以用这个方法安装. 试试嘛,如果懒得试,可以忽略这篇文章. ...

  5. Android Audio控制和MediaButton远程控制(音视频控制配合)

    使用过Android系统的朋友应该都知道,Android里面声音是区分好几种情况,每种情况下的音频大小是独立的.也就是说你调节了电话铃声大小不会影响多媒体播放的声音大小.这个涉及了AudioStrea ...

  6. Android判断当前线程是否是主线程的方法

    开发过程中有时候会在Thread类中执行某些操作,有些操作会由于Android版本的不同,尤其是低版本而Crash,因此必要的时候会查看某些容易引起crash的操作是否是在主线程,这里举三种方法: 方 ...

  7. javascript一种新的对象创建方式-Object.create()

    1.Object.create() 是什么? Object.create(proto [, propertiesObject ]) 是E5中提出的一种新的对象创建方式,第一个参数是要继承的原型,如果不 ...

  8. Android 5.0 双卡信息管理分析

    首先,如前面的博文所讲的,Android5.0开始支持双卡了.另外,对于双卡的卡信息的管理,也有了实现,尽管还不是完全彻底完整,如卡的slot id, display name,iccid,color ...

  9. <欧奈尔制胜法则—如何在股市中赚钱>读书笔记

    在选择个股建仓时,要选择那些在最近季度报表中,每股收益比上年同期要有较大增幅的股票. 每股收益是指公司税后净利润除以公司普通股的总股本 选择年增长率为25%--50%的公司 年度盈利和季度盈利都要出色 ...

  10. 【jquery】一款不错的音频播放器——Amazing Audio Player

    前段时间分享了一款视频播放器,点击这里.今天介绍一款不错的音频播放器——Amazing Audio Player. 介绍: Amazing Audio Player 是一个使用很方便的 Windows ...