zoukankan      html  css  js  c++  java
  • 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);
            }
  • 相关阅读:
    Codeforces Round #562 (Div. 2) B. Pairs
    Codeforces Round #562 (Div. 2) A.Circle Metro
    K.河北美食
    H.天神的密码
    国标GB28181协议智能分析告警平台EasyGBS及EasyCVR监控系统内iframe的常见问题说明
    【解决方案】国标GB28181平台EasyGBS级联EasyCVR视频智能分析搭建“蓝天卫士”网络视频监控系统技术方案
    【解决方案】基于国标GB28181协议/HIKSDK/Ehome协议EasyCVR智能融合分析平台在智慧校园人脸识别中的应用
    TSINGSEE青犀视频基于开源Webrtc服务器编译mediasoupClient运行报”SignalEncoderTimeOut, Encoder timed out”
    TSINGSEE青犀视频云边端H265播放器EasyPlayer-RTSP在C#版本增加OSD功能说明
    TSINGSEE青犀视频自主研发的H265播放器被集成后无法播放视频是什么原因?
  • 原文地址:https://www.cnblogs.com/zjbky/p/9712863.html
Copyright © 2011-2022 走看看