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);
        }
原文地址:https://www.cnblogs.com/zjbky/p/9712863.html