`
vv_1024
  • 浏览: 112095 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

通用XML操作类(微型本地xml数据库)

    博客分类:
  • C#
XML 
阅读更多
    //author:俞立全
   //Email:vv_2048@163.com
    //Date: 2010-10-24
    /// <summary>
    /// 通用的 XML 操作类 (微型本地xml数据库)
    /// </summary>
    /// <typeparam name="T"></typeparam>
    class XmlUtils<T>
    {
        /// <summary>
        /// xml 保存路径
        /// </summary>
        private static readonly String xmlPath = @"data\";
        /// <summary>
        /// 主键名
        /// </summary>
        public static readonly String primaryPropertyName = "Id";


        /// <summary>
        /// 创建xml文件
        /// </summary>
        /// <param name="t"></param>
        public static void CreateXMLFile(T t)
        {
            String className = ReflectionUtils<T>.GetClassName(t);
            XmlDocument xmldoc = new XmlDocument();

            //加入XML的声明段落
            XmlNode xmlnode = xmldoc.CreateNode(XmlNodeType.XmlDeclaration,"", "");
            xmlnode.Value = "version=\"1.0\" encoding=\"utf-8\"";
            xmldoc.AppendChild(xmlnode);

            //加入一个根元素
            XmlElement xmlelem = xmldoc.CreateElement("Root");
            //XmlText xmltext = xmldoc.CreateTextNode ( "Root Text" ) ;
            //xmlelem.AppendChild ( xmltext ) ;
            xmldoc.AppendChild(xmlelem);
            if (!Directory.Exists(xmlPath))
            {
                Directory.CreateDirectory(xmlPath);
            }
            xmldoc.Save(xmlPath + className + ".xml");
        }

        /// <summary>
        /// 判断主键是否唯一
        /// </summary>
        /// <param name="xmldoc"></param>
        /// <param name="className"></param>
        /// <param name="o"></param>
        /// <returns></returns>
        private static Boolean IsPrimaryKeyUnique(XmlDocument xmldoc,String className,Object o)
        {
            String xPathStr = "Root/" + className + "[" + primaryPropertyName + "='"+ o.ToString() +"']";
            // XPath 查询
            XmlNodeList nodeList = xmldoc.SelectNodes(xPathStr);
            if (nodeList.Count > 0)
            {
                return false;
            }
            else
            {
                return true;
            }
         
        }

        /// <summary>
        /// 插入对象
        /// </summary>
        /// <param name="t"></param>
        public static void InsertXmlItem(T t)
        {
            String className = ReflectionUtils<T>.GetClassName(t);
            XmlDocument xmldoc = new XmlDocument();
            //加载xml文件
            try
            {
                xmldoc.Load(xmlPath + className + ".xml");
            }
            catch (Exception e)
            {

                Console.WriteLine(e.Message);
            }

            //判断 主键号是否有值 或者 主键已经存在
            Object o = ReflectionUtils<T>.GetTPropertyValue(t, primaryPropertyName);
            if (o != null && IsPrimaryKeyUnique(xmldoc, className, o))
            {
                //获取根节点
                XmlNode root = xmldoc.DocumentElement;
                //创建子节点
                XmlElement itemNode = xmldoc.CreateElement(className);

                PropertyInfo[] propertyInfos = ReflectionUtils<T>.GetPropertyInfos(t);
                foreach (PropertyInfo propertyInfo in propertyInfos)
                {
                    String propertyName = propertyInfo.Name;
                    String propertyValue = propertyInfo.GetValue(t, null) == null ? "" : propertyInfo.GetValue(t, null).ToString();
                    XmlElement propertyNode = xmldoc.CreateElement(propertyName);
                    propertyNode.InnerText = propertyValue;
                    itemNode.AppendChild(propertyNode);
                }
                root.AppendChild(itemNode);
                xmldoc.Save(xmlPath + className + ".xml");
            }
            else
            {
                throw new Exception("插入数据失败,插入的主键为空或者主键已经存在。");
            }
            
            
        }

        /// <summary>
        /// 批量插入对象
        /// </summary>
        /// <param name="list"></param>
        public static void BatchInsertXmlItem(List<T> list)
        {
            String className = typeof(T).Name;
            XmlDocument xmldoc = new XmlDocument();
            //加载xml文件
            try
            {
                xmldoc.Load(xmlPath + className + ".xml");
            }
            catch (Exception e)
            {

                Console.WriteLine(e.Message);
            }
            //获取根节点
            XmlNode root = xmldoc.DocumentElement;
            
            foreach (T t in list)
            {
                //创建子节点
                XmlElement itemNode = xmldoc.CreateElement(className);
                PropertyInfo[] propertyInfos = ReflectionUtils<T>.GetPropertyInfos(t);
                foreach (PropertyInfo propertyInfo in propertyInfos)
                {
                    String propertyName = propertyInfo.Name;
                    String propertyValue = propertyInfo.GetValue(t, null) == null ? "" : propertyInfo.GetValue(t, null).ToString();
                    XmlElement propertyNode = xmldoc.CreateElement(propertyName);
                    propertyNode.InnerText = propertyValue;
                    itemNode.AppendChild(propertyNode);
                }
                root.AppendChild(itemNode);
            }
            
            xmldoc.Save(xmlPath + className + ".xml");
        }

        /// <summary>
        /// 更新对象
        /// </summary>
        /// <param name="t"></param>
        public static void UpdateXmlItem(T t)
        {
            String className = ReflectionUtils<T>.GetClassName(t);
            XmlDocument xmldoc = new XmlDocument();
            //加载xml文件
            try
            {
                xmldoc.Load(xmlPath + className + ".xml");
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
            // 拼接 XML XPath 查询字符串 
            String xPathStr = "Root/" + className + "[" + primaryPropertyName + "='" + ReflectionUtils<T>.GetTPropertyValue(t, primaryPropertyName) + "']";
            // XPath 查询
            XmlNodeList nodes = xmldoc.SelectNodes(xPathStr);
            if (nodes.Count > 0)
            {
                foreach (XmlNode xmlNode in nodes)
                {
                    XmlElement xmlElement = (XmlElement)xmlNode;
                    // 属性遍历
                    PropertyInfo[] propertyInfos = ReflectionUtils<T>.GetPropertyInfos(t);
                    foreach (PropertyInfo propertyInfo in propertyInfos)
                    {
                        String propertyName = propertyInfo.Name;
                        String propertyValue = propertyInfo.GetValue(t, null) == null ? "" : propertyInfo.GetValue(t, null).ToString();
                        // 更新
                        xmlElement.SelectSingleNode(propertyName).InnerText = propertyValue;
                    }
                }
                // 保存
                xmldoc.Save(xmlPath + className + ".xml");
            }
        }

        /// <summary>
        /// 删除对象
        /// </summary>
        /// <param name="t"></param>
        public static void DeleteXMLItem(T t)
        {
            String className = ReflectionUtils<T>.GetClassName(t);
            XmlDocument xmldoc = new XmlDocument();
            //加载xml文件
            try
            {
                xmldoc.Load(xmlPath + className + ".xml");
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
            // 拼接 XML XPath 查询字符串 
            String xPathStr = "Root/" + className + "[" + primaryPropertyName + "='" + ReflectionUtils<T>.GetTPropertyValue(t, primaryPropertyName) + "']";
            // XPath 查询
            XmlNodeList nodes = xmldoc.SelectNodes(xPathStr);
            if (nodes.Count > 0)
            {
                foreach (XmlNode xmlNode in nodes)
                {
                    xmlNode.ParentNode.RemoveChild(xmlNode);
                }
                xmldoc.Save(xmlPath + className + ".xml");
            }
        }

        /// <summary>
        /// 获取所有对象
        /// </summary>
        /// <returns></returns>
        public static List<T> GetList()
        {
            List<T> list = new List<T>();
            String className = typeof(T).Name;
            XmlDocument xmldoc = new XmlDocument();
            //加载xml文件
            try
            {
                xmldoc.Load(xmlPath + className + ".xml");
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
            XmlNodeList nodeList = xmldoc.GetElementsByTagName(className);
            foreach (XmlNode xmlNode in nodeList)
            {
                T t = Activator.CreateInstance<T>();
                XmlElement xmlElement = (XmlElement)xmlNode;
                // 属性遍历
                PropertyInfo[] propertyInfos = ReflectionUtils<T>.GetPropertyInfos(t);
                foreach (PropertyInfo propertyInfo in propertyInfos)
                {
                    String propertyName = propertyInfo.Name;
                    ReflectionUtils<T>.SetTPropertyValue(t, propertyName, xmlElement.SelectSingleNode(propertyName).InnerText);
                }
                list.Add(t);
            }
            return list;
        }

        /// <summary>
        /// 多条件查询 查询数组为空,表示查询所有
        /// </summary>
        /// <param name="pName">属性名</param>
        /// <param name="value">属性值</param>
        /// <param name="isEqual">true 等值查询,false 模糊查询</param>
        /// <returns></returns>
        public static List<T> GetListByCondition(String[] pNames, String[] values, Boolean isEqual)
        {
            List<T> list = new List<T>();
            String className = typeof(T).Name;
            XmlDocument xmldoc = new XmlDocument();
            //加载xml文件
            try
            {
                xmldoc.Load(xmlPath + className + ".xml");
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
            // 拼接 XML XPath 查询字符串
            String condition = GetXPath(pNames,values,isEqual);
            String xPathStr = "Root/" + className + condition;

            // XPath 查询
            XmlNodeList nodeList = xmldoc.SelectNodes(xPathStr);

            foreach (XmlNode xmlNode in nodeList)
            {
                T t = Activator.CreateInstance<T>();
                XmlElement xmlElement = (XmlElement)xmlNode;
                // 属性遍历
                PropertyInfo[] propertyInfos = ReflectionUtils<T>.GetPropertyInfos(t);
                foreach (PropertyInfo propertyInfo in propertyInfos)
                {
                    String propertyName = propertyInfo.Name;
                    ReflectionUtils<T>.SetTPropertyValue(t, propertyName, xmlElement.SelectSingleNode(propertyName).InnerText);
                }
                list.Add(t);
            }
            return list;
        }



        /// <summary>
        /// 拼接 XPath 查询条件参数
        /// 等值查询:String xPath = "users/user[username='huo' and password='123']";
        /// 模糊查询:String xPath = "users/user[contains(username,'huo') and contains(password,'123')]";
        /// </summary>
        /// <param name="pNames"></param>
        /// <param name="values"></param>
        /// <returns></returns>
        private static String GetXPath(String[] pNames, String[] values, Boolean isEqual)
        {
            StringBuilder sb = new StringBuilder();
            //等值查询
            if (isEqual)
            {
                //添加第一个元素
                if (pNames.Length > 0)
                {
                    sb.Append("[");
                    sb.Append(pNames[0]);
                    sb.Append("='");
                    sb.Append(values[0]);
                    sb.Append("'");
                }
                //添加后续元素
                if (pNames.Length > 1)
                {
                    for (int i = 1; i < pNames.Length; i++)
                    {
                        sb.Append(" and ");
                        sb.Append(pNames[i]);
                        sb.Append("='");
                        sb.Append(values[i]);
                        sb.Append("'");
                    }
                }
                //结尾加上 ]
                if (sb.Length > 0)
                {
                    sb.Append("]");
                }
            }
            else   //模糊查询
            {
                //添加第一个元素
                if (pNames.Length > 0)
                {
                    sb.Append("[");
                    sb.Append("contains(");
                    sb.Append(pNames[0]);
                    sb.Append(",'");
                    sb.Append(values[0]);
                    sb.Append("')");
                }
                //添加后续元素
                if (pNames.Length > 1)
                {
                    for (int i = 1; i < pNames.Length; i++)
                    {
                        sb.Append(" and ");
                        sb.Append("[");
                        sb.Append("contains(");
                        sb.Append(pNames[i]);
                        sb.Append(",'");
                        sb.Append(values[i]);
                        sb.Append("')");
                    }
                }
                //结尾加上 ]
                if (sb.Length > 0)
                {
                    sb.Append("]");
                }
            }
            return sb.ToString();
        }
    }

 

使用的时候,只要先建立对象模型,把模型做为参数传递进去即可,非常方便。

 

XmlUtils<User>.CreateXMLFile(new User());
XmlUtils<User>.InsertXmlItem(User);
XmlUtils<User>.UpdateXmlItem(User);
XmlUtils<User>.DeleteXMLItem(User);

List<User> users= XmlUtils<User>.GetList();
List<User> users= XmlUtils<User>.GetListByCondition(new String[] {}, new String[] {},true);
List<User> users= XmlUtils<User>.GetListByCondition(new String[] { "Name" }, new String[] { "测" },false);
List<User> users= XmlUtils<User>.GetListByCondition(new String[] { "Name", "Id" }, new String[] { "测试", "1" }, true);

 

目前还不支持对象关联操作。

0
0
分享到:
评论

相关推荐

    推荐一款xml分析微型库tinyxml

    TinyXML提供了如TiXMLDocument、TiXmlElement、TiXmlText等类,分别代表XML文档、元素和文本节点,这些类提供了丰富的成员函数,使得操作XML变得非常直观。 在TinyXML中,解析XML文档通常从创建一个TiXMLDocument...

    LabVIEW利用OLE自动化读写XML文件

    ②它比ini文件功能强大,它可以编写复杂逻辑关系的数据配置文件,类似一个微型的数据库文件。。。。。。 感谢微软提供了OLE技术,使得不同程序之间可以通过预先指定的接口互相调用。微软提供了MSXML2.0, 4.0 及 ...

    xml.rar_j2me_j2me xml_java xml_xml j2me

    压缩包内的文件"XmlReader.java"和"XmlParse.java"很可能就是实现这个微型XML解析器的源代码。`XmlReader`可能是XML数据的读取器,负责从输入流中提取XML内容;`XmlParse`可能是解析器的核心类,执行实际的解析工作...

    noear微型ORM框架(支持:java sql,xml sql,annotation sql;事务;缓存;监控;等...)

    noear微型ORM框架就是这样一个工具,它为Java开发者提供了灵活且高效的数据库访问方式,支持多种SQL执行模式,包括Java SQL、XML SQL以及Annotation SQL。 **支持的SQL执行模式** 1. **Java SQL**:在代码中直接...

    面向CSA算法的片上多核DSP处理器设计.pdf

    它可以解析XML,创建和修改DOM树,方便地进行XML操作。在转换过程中,DOM4j用于读取XML文档并生成节点树。 3. **节点树规则和映射规则**:根据预定义的规则,JavaBean对象被转换为节点树,接着判断这些节点并依据...

    将sql表转换为xml文件

    1. **数据集(DataSet)与WriteXml方法**:DataSet是.NET Framework中的一个强类型数据集合,它可以用来存储和操作关系型数据,就像在内存中有一个微型数据库一样。WriteXml方法是DataSet类的一个成员,它的主要功能...

    在安卓端创建服务,可访问本地网页制作离线网页App基于AndServe

    对于AndServe,可以通过服务端接口将这些数据库操作暴露给本地网页,使网页能直接调用接口进行数据操作。 6. **本地访问与网络请求**:在Android应用中,通常使用HttpURLConnection或第三方库如OkHttp来处理网络...

    微型博客jsp、java实现

    在微型博客系统中,Servlet用于接收用户请求,处理业务逻辑,如登录验证、发布微博、评论等操作。 2. **JSP语法**:JSP页面可以包含HTML标记、脚本元素(scriptlets)、表达式和声明。例如,使用`&lt;%= expression %&gt;...

    基于ssm开发的微型项目

    在SSM项目中,MyBatis作为数据访问层,通过XML配置文件或者注解定义SQL映射,简化了DAO(Data Access Object)层的开发,使得数据库操作更加灵活高效。 4. **项目结构**:一个典型的SSM项目通常包括以下几个部分: ...

    C# 初学 微型考试系统

    在学习C#的过程中,开发一个微型考试系统是一个很好的实践项目,它能帮助我们深入理解基础语法、文件操作以及用户界面设计。这个系统具备基本的功能,如用户注册、登录、管理学生和教师档案,以及进行学生考试和教师...

    H2Demo_Person:一个微型演示如何将H2数据库与JPA一起使用

    《H2数据库与JPA整合应用的微型演示》 在Java开发中,数据库的使用是不可或缺的一部分。H2数据库是一款轻量级、高性能的关系型数据库,尤其适合于测试和小型项目。而Java Persistence API(JPA)则是Java平台上的一...

    JACo XML ( java xml )-开源

    开发者无需直接操作DOM(Document Object Model)或SAX(Simple API for XML)等底层API,而是可以将XML文件视作对象实例来操作,这极大地提高了开发效率和代码的可读性。 该组件的核心理念是对象化XML,这意味着...

    安卓类简单的微博系统

    【安卓类简单的微博系统】是一个基于安卓平台的微型社交媒体应用示例,旨在提供类似微博的基本功能,让用户能够在移动设备上体验发布、查看和互动。这个项目涵盖了安卓开发的关键技术,如用户界面设计、数据存储、...

    JAVA微型文件查看器

    【JAVA微型文件查看器】是一种基于Java编程语言开发的小型应用程序,主要功能是方便用户查看各种类型的文件内容。由于其“微型”的特性,通常体积小巧,易于使用,并且可能具有跨平台的能力,因为Java程序可以在任何...

    基于XQuery处理器的异构数据集成中间件.pdf

    该中间件通过将异构数据源分为关系数据库数据源、XML数据源和非结构化数据源三类,每类数据源使用XQuery模式处理,构建虚拟视图,使待集成的异构数据源构建成一个逻辑数据库。通过在中间件中引入XQuery处理器,使其...

    jbpm原理微型源码

    **jbpm原理微型源码详解** jbpm,全称Java Business Process Management,是一个开源的工作流管理系统,用于管理和执行业务流程。它提供了强大的流程定义、执行和监控能力,使得开发者能够轻松地实现业务流程自动化...

    中工网上商城,使用python3+flask开发,数据库使用sqlite。.zip

    通过ORM(对象关系映射),可以将Python类与数据库表关联,方便地进行数据操作。 综上所述,“中工网上商城”项目展示了如何运用Python3和Flask框架构建一个电商网站,并利用SQLite数据库来存储和管理数据。开发者...

    合肥师范android实验报告材料实验五.docx

    - **SQLite数据库的基本使用**:SQLite是Android内置的轻量级数据库,用于本地数据存储。创建数据库、表,以及执行增删改查操作。 4. **实验步骤**: - **创建布局文件**:`login_main.xml`和`welcome_main.xml`...

    ADO.NET

    其中,**DataSet**是核心组件,它在内存中存储数据,模拟了一个微型数据库,支持数据关系、约束和数据操作,即使在没有数据库连接的情况下也能进行数据操作。 8. **DataTable、DataColumn和DataRow**: 分别代表了...

    ADO.NET高级编程PDF

    `DataSet`可以理解为内存中的微型数据库,不直接与数据库连接,允许脱机操作。`DataTable`是DataSet的一部分,用于存储数据表。`Load()`方法通过DataAdapter将数据库数据加载到DataSet。 5. **数据绑定** ADO.NET...

Global site tag (gtag.js) - Google Analytics