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

 

转载http://hi.baidu.com/pappercut/blog/item/1882c43da44352c09e3d627b.html

 

首先创建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");

posted @ 2011-06-23 17:12  妖*小夜  阅读(266)  评论(0编辑  收藏  举报