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

一个实例掌握linq to XML增查删改

    博客分类:
  • .NET
阅读更多

最近忽然想把过去写的IPMSG更新一下,把聊天记录部分改用linq实现,感觉确实比DOM直观多了,写下来希望对新手有帮助,linq to XML 所用的类都封装在System.Xml.Linq下,下面的例子还会需要System.Linq

首先创建log文件
            string strNow = DateTime.Now.ToString("yyyyMMddhhmmss" );

            FileInfo fiXML = new FileInfo(@"XML\xmlLog.xml" );
            //如果文件不存在
            if (!(fiXML.Exists))
            {
                //创建xml文档
                XDocument xelLog =new XDocument(
                    new XDeclaration("1.0" , "utf-8" , "no" ),
                    new XElement("ipmsg" ,
                        new XElement("msg_log" ,
                            new XElement("user" , "Bin" ),
                            new XElement("logdate" , strNow),
                            new XElement("message" , "一条xml linq测试" )
                        )
                     )
                 );
                xelLog.Save(@"XML\xmlLog.xml" );
            }

如果要给元素加属性用XAttribute,和子节点一起做参数传进去,比如在这里我们想给每条聊天记录都加一个ID:
new XAttribute( "logid" , "00001" ),

输出文档如下:

<?xml version="1.0" encoding="utf-8" standalone="no" ?>
<netmsg>
<msg_log logid="00001" >
    <user>Bin </user>
    <logdate>20081217090733 </logdate>
    <message>一条xml linq测试 </message>
</msg_log>
</netmsg>


当然也可以用元素的形式表示ID,个人习惯问题,属性和元素功能基本是一样的,可以互相转换。

一、检索记录

    首先要有检索功能,查看全部聊天记录:
            Array queryXML = LinqHeper.getXmlLOGInFo();
       
    返回Array,自己随意处理,比如:
           dgvStudent.DataSource = queryXML;
   
    下面是getXmlLOGInFo方法:
            //实例化XMLog
            XElement xelem = XElement.Load(@"XML\xmlLog.xml");

            //执行linq检索(xmlLOG)
            var queryXML = from xmlLog in xelem.Descendants("msg_log" )
                                     //条件都加在这里,注意条件用双等,多条件用 && 连接
                                     //用户名是Bin的所有记录
                           //where xmlLog.Element("user").Value == "Bin"  

                                     select new {
                                     用户名 = xmlLog.Element("user" ).Value.ToUpper()
                                  , 时间 = xmlLog.Element("logdate" ).Value
                                  , 消息 = xmlLog.Element("message" ).Value
                           };

            return queryXML.ToArray();

    上边的语句也可以写成lambda表达式的形式(其实就是"=>"前是参数,后面是返回值)
            var queryXML = xelem.Descendants("msg_log" )
        .Where(x =>( x.Element("logid" ).Value == "1334255" && x.Element("user" ).Value == "bin" ))
                  .Select(x => new {
                                    用户名 = x.Element("user" ).Value.ToUpper()
                                    , 时间 = x.Element("logdate" ).Value
                    , 消息 = x.Element("message" ).Value });

    不过还是比较推荐前面写的方法,比较直观,方便维护(在这个例子中lambda表达式没有很大优势,一般情况,还是可以减少很多代码的)

    注:如果想分页就用Skip与Take方法,比如queryXML.Skip(45).Take(15)就是第四页(我没有用dgv)

二、添加记录
       
    下面需要用到System.Collections.Generic

        strNow = DateTime.Now.ToString("yyyyMMddhhmmss" );
        Dictionary<string,string> dicLog = new Dictionary<string,string>();
            dicLog.Add("user" , "Bin" );
            dicLog.Add("logdate" , strNow);
            dicLog.Add("message" , "这是一条添加记录测试" );

            LinqHeper.insLog(dicLog);

    
     insLog方法:

        //实例化XMLog
            XElement xelem = XElement.Load(@"XML\xmlLog.xml" );

            //执行linq添加(xmlLOG)
            XElement newLog = new XElement("msg_log" ,
                                  new XElement("user" , (string)dicLog["user" ]),
                                  new XElement("logdate" , (string)dicLog["logdate" ]),
                                  new XElement("message" , (string)dicLog["message" ])
                              );
            xelem.Add(newLog);
          //保存xml
            xelem.Save(@"XML\xmlLog.xml" );


三、修改记录

    如果一个朋友换了一个用户名,我们希望可以把他现在和过去的聊天记录在一起显示,就要把过去的名字全换成现在的新名,例子:

            var queryXML = from xmlLog in xelem.Descendants("msg_log" )
                                     //所有名字为Bin的记录
                           where xmlLog.Element("user" ).Value == "Bin"
                           select xmlLog;

            foreach (XElement el in queryXML)
            {
                el.Element("user" ).Value = "LiuBin" ;//开始修改
            }


四、删除记录

    。。这种软件应该没有必要删除聊天记录,但是既然标题是增查删改,就硬加上了,如果觉得记录占的地方太大了,我们想把2008年1月1日(或1个月前)以前的记录全部删除,就用如下方法:
   
            //实例化XMLog
            XElement xelem = XElement.Load(@"XML\xmlLog.xml" );

            var queryXML = from xmlLog in xelem.Descendants("msg_log" )
                          where Convert.ToInt32(xmlLog.Element("logdate" ).Value) < 20080101010101
                              select xmlLog;

            queryXML.Remove();
            xelem.Save(@"XML\xmlLog.xml" );

分享到:
评论

相关推荐

    Linq增删改查源文件带数据库

    “LinqToSql”是文件名中的一个关键词,指的是LINQ to SQL,这是.NET Framework中的一个ORM(对象关系映射)工具,允许开发者使用C#或VB.NET的 LINQ 语法与SQL Server数据库进行交互。以下是对LINQ to SQL主要概念的...

    linq to sql实现分层与gridview使用实现增删改

    在本教程中,我们将重点讨论如何利用LINQ to SQL实现分层架构,并结合GridView控件进行数据的增删改操作,这对于新手在进行三层项目开发时是非常实用的。 首先,让我们了解什么是LINQ to SQL。它是.NET Framework ...

    Linq增删改查

    以Linq to Entities为例,假设我们有一个`Student`实体类和一个`DbContext`对象`context`: 1. 添加(Add):创建一个新的学生实例并添加到数据库。 ```csharp var newStudent = new Student { Name = "张三", Age ...

    linq中文教程linq学习资料

    - **增删改**:使用LINQ to SQL进行数据库的插入、更新和删除操作。 - **查询句法**:学习LINQ的查询表达式和方法语法,如何编写复杂的查询。 - **存储过程**:调用数据库中的存储过程,并将结果转换为对象。 - **...

    商业源码-编程源码-Linq三层模式之增删改源码.zip

    这里的“商业源码-编程源码-Linq三层模式之增删改源码.zip”提供了一个使用LINQ实现的三层架构示例,用于演示在数据库操作中的基本增删改功能。三层架构是一种常见的软件设计模式,它将应用程序分为表示层、业务逻辑...

    Linq.rar_ linq to odbc_Linq-CSharp.part_linq

    6. **Linq Demo**:压缩包中的"LinqDemo"可能是一个演示项目,包含了如何在实际应用中使用Linq进行数据操作的实例代码,包括三层架构的实现和Linq to ODBC的使用。 7. **www.pudn.com.txt**:这个文件可能是从pudn....

    Linq to sql 中文教程

    同时,事务管理也是 Linq to SQL 的一个重要方面,通过 `TransactionScope` 或 `DbContext.Database.BeginTransaction` 等方式可以开启和管理事务。 #### 9. 继承与关系 Linq to SQL 支持实体间的继承关系和关联...

    LINQ中文教程

    3. **增删改**:如何使用LINQ to SQL进行数据的插入、更新和删除操作。 4. **查询句法**:学习LINQ的查询表达式和方法语法,以及如何使用它们来检索数据。 5. **存储过程**:如何调用数据库中的存储过程,并将结果...

    Linq DataContext

    1. **实例化**:首先,需要创建DataContext的一个实例,传入数据库的连接字符串或DbConnection对象。 2. **数据表映射**:定义实体类,并使用[Table]属性标记,告诉DataContext这些类对应数据库中的哪些表。 3. **...

    LINQ表左式中文教程

    LINQ (Language Integrated Query) 是.NET Framework中的一个强大功能,它将查询语句直接集成到C#和Visual Basic等编程语言中,提供了统一的方式来处理各种数据源,包括对象、数据库、XML等。本教程主要关注的是LINQ...

    Linq入门学习教程

    Linq支持的查询可以针对不同数据源进行,包括但不限于SQL数据库(LINQ to SQL)、对象集合(LINQ to Objects)、XML文档(LINQ to XML)等,实现了数据查询的泛型化和统一化。 #### 二、LINQ to Object **1. 基本...

    用Silverlight+WCFRIAServices+Linq做的Student实例

    本文将深入探讨如何利用Silverlight、WCF RIA(Windows Communication Foundation Rich Internet Applications)Services以及Linq(Language Integrated Query)技术,构建一个名为"Student"的实例。这三种技术的...

    课件-LINQ简介.zip

    对于初学者来说,这是一个很好的起点,能够帮助理解LINQ的基本原理和应用场景。对于有经验的开发者,重温这些基础知识也能巩固技能,提高开发效率。无论是教学还是自学,这都是一份有价值的资源。

    C#操作Xml文件.rar_CSahrpForXml

    例如,你可以使用Load方法加载XML文件,然后通过SelectNodes或SelectSingleNode方法查询XML节点,再用RemoveChild、AppendChild等方法进行增删改操作。 其次,XPath和LINQ to XML是C#中处理XML的两种高效方式。...

    三层模式之增删改源码

    本示例项目"三层模式之增删改源码"主要展示了如何在.NET Framework 2.0和SQL Server 2005环境下,利用LINQ(Language Integrated Query)技术构建一个具备基本CRUD(Create、Read、Update、Delete)功能的三层架构...

    Nhibernate简单实例

    同时,需要为每个实体类创建一个XML映射文件(或使用Fluent NHibernate进行代码配置),定义字段类型、主键、外键等信息。映射文件告诉Nhibernate如何将类与数据库表关联。 **SessionFactory与Session** ...

    C#针对xml基本操作及保存配置文件应用实例

    在C#中,XML文件是一种常见的数据存储和交换格式,尤其在配置文件的应用上非常广泛。本篇将探讨C#中对XML文件的基础操作,包括创建...在实际开发中,还可以结合LINQ to XML等更现代的方法,提高代码的简洁性和可读性。

Global site tag (gtag.js) - Google Analytics