浪漫的周末从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. Leetcode 125 Valid Palindrome 字符串处理

    题意:判断字符串是否是回文字符串 先将所有的字母和数字字符保留,并将大写字母转化成小写字母,然后将字符串倒置,比较前后两个字符串是否相同. 该题最好的解法可以模仿 Leetcode 345 Rever ...

  2. (转载)新手如何正确理解GitHub中“PR(pull request)”中的意思

    我从知乎看到的两个答案,分别从实际意义以及语言学角度告诉你改怎么理解PR,很简洁,这个理解非常棒,会解决新手刚看到PR(pull request)这个词时的困惑.   实际意义:   有一个仓库,叫R ...

  3. IoC实践--用Unity实现MVC5.0的IoC控制反转方法

    在MVC中,控制器依赖于模型对数据进行处理,也可以说执行业务逻辑.我们可以使用依赖注入(DI)在控制层分离模型层,这边要用到Repository模式,在领域驱动设计(DDD)中,Repository翻 ...

  4. SVN命令模式批量更新多个项目文件

    使用svn作为版本管理是,在一个仓库下边同时建立多个项目,每天上班都需要一个个更新,为了发挥程序员懒的精神,能让电脑做的,绝不手工操作.作为自动化处理,在windows环境,首先想到了bat Tort ...

  5. 巧用Windows 7计划任务设置定时提醒

    Windows 7系统有个“计划任务”功能,一般人都很少使用.其实,“计划任务”是系统自带的一个很实用的功能,比如说,这个功能可以设置定时提醒,这样在使用电脑时就不会因为太过投入而导致错过重要的事务. ...

  6. 用DOS批处理实现FTP自动上传、下载、清理文件

    用DOS批处理实现FTP自动上传.下载.清理文件 最近好像特别的忙,好久没来写点东西了,今天写了一个利用批处理程序完成FTP自动上传.下载.清理文件的程序.赶紧 记录下来,以备日后之用.功能介绍:自动 ...

  7. openCV_java Canny边缘检测

    边缘检测的原理: 检测出图像中所有灰度值变化较大的点,而且这些点连起来构成若干线条,这些线条就称之为图像的边缘. 1986年,由John F. Canny 提出! // Canny(Mat image ...

  8. C# 修改webbrowser 的 useragent

    Also, there is a refresh option in the function (according to MSDN). It worked well for me (you shou ...

  9. Core Java - 流(Stream) - 字节流和字符流(一)

    0. 概述: Java中基于流的I/O构建在4个抽象类之上, 其中2个是字节流,另外2个是字符流. 字节流: InputStream / OutputStream 当操作字节或其它二进制对象时,应当使 ...

  10. Codeforces Beta Round #83 (Div. 1 Only)题解【ABCD】

    Codeforces Beta Round #83 (Div. 1 Only) A. Dorm Water Supply 题意 给你一个n点m边的图,保证每个点的入度和出度最多为1 如果这个点入度为0 ...