zoukankan      html  css  js  c++  java
  • 掌握linq to XML增查删改小示例(收藏) 西安

    最近忽然想把过去写的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");

  • 相关阅读:
    数据仓库中的几种数据模型
    数据仓库为什么要分层
    数据仓库的两种建模方法
    数据仓库之架构发展
    数据仓库是什么
    ETL 自动化测试框架
    大数据测试之ETL测试工具和面试常见的问题及答案
    Hadoop面试链接
    Hadoop 面试总结
    Spark 基本架构及原理
  • 原文地址:https://www.cnblogs.com/zhouzhaokun/p/2078302.html
Copyright © 2011-2022 走看看