• c#中xml增删查改


            /// <summary>
            /// xml转list
            /// </summary>
            /// <typeparam name="T">目标对象</typeparam>
            /// <param name="xmlFullpath">xml文件地址(绝对路径)</param>
            /// <param name="nodeName">节点路径(如:nodes/node)</param>
            /// <returns></returns>
            public static List<T> XmlToList<T>(string xmlFullpath, string nodeName) where T:class 
            {
                List<T> dtos = new List<T>();
                XmlDocument doc = new XmlDocument();
                if (!File.Exists(xmlFullpath))
                {
                    throw new Exception("未找到数据源:"+xmlFullpath);
                }
                doc.Load(xmlFullpath);
                XmlNodeList nodes = doc.SelectNodes(nodeName);
                if (nodes != null && nodes.Count > 0)
                {
                    foreach (XmlNode node in nodes)
                    {
                        var dto = Activator.CreateInstance<T>();
                        var childNodes = node.ChildNodes;
                        foreach (XmlNode childNode in childNodes)
                        {
                            var property = typeof(T).GetProperty(childNode.Name);
                            if (property != null)
                            {
                                try
                                {
                                    var value = Convert.ChangeType(childNode.InnerText, property.PropertyType);
                                    property.SetValue(dto, value);
                                }
                                catch (Exception ex)
                                {
                                    throw new Exception(string.Format("字段【{0}】赋值出错,{1}",property.Name,ex.Message));
                                }
                            }
                        }
                        dtos.Add(dto);
                    }
                }
                return dtos;
            }
    
            /// <summary>
            /// 新增xml节点
            /// </summary>
            /// <typeparam name="T">泛型类</typeparam>
            /// <param name="xmlFilePath">xml文件绝对地址</param>
            /// <param name="xPath">要添加的xml父级节点路径</param>
            /// <param name="nodeName">要添加节点的名称</param>
            /// <param name="addList">数据集合</param>
            public static void AddXmlNodes<T>(string xmlFilePath, string xPath, string nodeName, List<T> addList) where T : class
            {
                if (addList == null || addList.Count == 0)
                {
                    return;
                }
                if (!File.Exists(xmlFilePath))
                {
                    throw new Exception("文件不存在");
                }
                var xmlDoc = new XmlDocument();
                xmlDoc.Load(xmlFilePath);
                var rootNode = xmlDoc.SelectSingleNode(xPath);
                if (rootNode == null)
                {
                    throw new Exception("不存在根节点");
                }
                foreach (var item in addList)
                {
                    var node = xmlDoc.CreateElement(nodeName);
                    var properties = typeof(T).GetProperties();
                    foreach (var property in properties)
                    {
                        //过滤掉忽略的字段
                        var ignoreAttr = property.GetCustomAttributes(typeof(IgnoreDataMemberAttribute)).FirstOrDefault();
                        if (ignoreAttr != null)
                            continue;
                        var childNode = xmlDoc.CreateElement(property.Name);
                        childNode.InnerText = property.GetValue(item) != null ? property.GetValue(item).ToString() : "";
                        node.AppendChild(childNode);
                    }
                    rootNode.AppendChild(node);
                }
                xmlDoc.Save(xmlFilePath);
            }
    
            /// <summary>
            /// 更新xml节点
            /// </summary>
            /// <typeparam name="T">泛型类</typeparam>
            /// <param name="xmlFilePath">xml文件绝对地址</param>
            /// <param name="xPath">要更新的xml父级点路径</param>
            /// <param name="key">唯一标识名称</param>
            /// <param name="updateList">要更新的数据集</param>
            public static void UpdateNodes<T>(string xmlFilePath, string xPath, string key, List<T> updateList) where T : class
            {
                var xmlDoc = new XmlDocument();
                if (!File.Exists(xmlFilePath))
                {
                    throw new Exception("文件不存在");
                }
                xmlDoc.Load(xmlFilePath);
                var rootNode = xmlDoc.SelectSingleNode(xPath);
                if (rootNode == null)
                {
                    throw new Exception("xml节点不存在");
                }
                var nodes = rootNode.ChildNodes;
                foreach (var item in updateList)
                {
                    var properties = typeof(T).GetProperties();
                    var keyItem = properties.FirstOrDefault(t => t.Name == key);
                    if (keyItem == null)
                        throw new Exception("未在泛型类中查找到与唯一标识名称对应的字段属性");
                    var keyValue = keyItem.GetValue(item, null);
                    if (keyValue==null)
                    {
                        throw new Exception(string.Format("唯一标识{0}值不能为空",key));
                    }
                    foreach (XmlNode node in nodes)
                    {
                        var xmlKeyNode = node.SelectSingleNode(key);
                        if (xmlKeyNode != null && xmlKeyNode.InnerText == keyValue.ToString())
                        {
                            foreach (XmlNode child in node.ChildNodes)
                            {
                                var childItem = properties.FirstOrDefault(t => t.Name == child.Name);
                                if (childItem != null)
                                {
                                    child.InnerText = childItem.GetValue(item).ToString();
                                }
                            }
                            break;
                        }
                    }
                }
                xmlDoc.Save(xmlFilePath);
            }
    
            /// <summary>
            /// 删除xml节点
            /// </summary>
            /// <typeparam name="T">泛型类</typeparam>
            /// <param name="xmlFilePath">xml文件绝对地址</param>
            /// <param name="xPath">要删除的xml父级点路径</param>
            /// <param name="key">唯一标识名称</param>
            /// <param name="deleteList">要删除的数据集</param>
            public static void DeleteNodes<T>(string xmlFilePath, string xPath, string key, List<T> deleteList) where T : class
            {
                var xmlDoc = new XmlDocument();
                if (!File.Exists(xmlFilePath))
                {
                    throw new Exception("文件不存在");
                }
                xmlDoc.Load(xmlFilePath);
                var rootNode = xmlDoc.SelectSingleNode(xPath);
                if (rootNode == null)
                {
                    throw new Exception("xml节点不存在");
                }
                var nodes = rootNode.ChildNodes;
                foreach (var item in deleteList)
                {
                    var properties = typeof(T).GetProperties();
                    var keyItem = properties.FirstOrDefault(t => t.Name == key);
                    if (keyItem == null)
                        throw new Exception("未在泛型类中查找到与唯一标识名称对应的字段属性");
                    var keyValue = keyItem.GetValue(item, null);
                    if (keyValue == null)
                    {
                        throw new Exception(string.Format("唯一标识{0}值不能为空", key));
                    }
                    foreach (XmlNode node in nodes)
                    {
                        var xmlKeyNode = node.SelectSingleNode(key);
                        if (xmlKeyNode != null && xmlKeyNode.InnerText == keyValue.ToString())
                        {
                            rootNode.RemoveChild(node);
                            break;
                        }
                    }
                }
                xmlDoc.Save(xmlFilePath);
            }
  • 相关阅读:
    在不同的浏览器下FORM及它的小伙伴们默认样式的CSS属性值是不全然一致
    思考博客园的机器人攻击,想到我们可能也需要开启iptables
    大数据量的Mysql数据库备份策略
    win7或win2008系统中,出现【已停止工作,联机检查解决方案并关闭该程序,关闭程序】解决方法!
    Mysql的碎片查看与处理
    "个性化空间"性能优化方案设计初步
    假期结束后的工作安排
    GZIP压缩占用CPU大吗?
    媒体云平台
    关于二级缓存的设计思路
  • 原文地址:https://www.cnblogs.com/zjbky/p/9712863.html
Copyright © 2020-2023  润新知