/// <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 > )
{
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 == )
{
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);
}

c#中xml增删查改的更多相关文章

  1. java中CRUD(增删查改)底层代码的实现

    java中CRUD(增删查改)底层代码的实现: package com.station.dao; import com.station.model.Product; import java.sql.* ...

  2. js中数组增删查改unshift、push、pop、shift、slice、indexOf、concat、join

    js中数组增删查改unshift.push.pop.shift.slice.indexOf.concat.join

  3. MongoDB 学习笔记(二):shell中执行增删查改

    一.查 1.查询集合中所有文档:db.集合名.find(). 2.查询集合中第一个文档:db.集合名.findOne(). 3.指定查询条件:第一个参数就是指定查询条件 查询全部文档:db.集合名.f ...

  4. C# xml增删查改

    C# XML XmlDocument 添加命名空间: using System.Xml; 定义公共对象: XmlDocument xmldoc ; XmlNode xmlnode ; XmlEleme ...

  5. linq to xml 增删查改

    一.XML基本概述 XML文件是一种常用的文件格式,例如WinForm里面的app.config以及Web程序中的web.config文件,还有许多重要的场所都有它的身影.Xml是Internet环境 ...

  6. XML 增删查改

    <?xml version="1.0" encoding="utf-8"?> <users> <person name=" ...

  7. Ubuntu 中 iptables 增删查改

    iptables是linux系统自带的防火墙,功能强大.如果iptables不熟悉的话可以用apf,是一款基于iptables的防墙. 一.安装并启动防火墙 $ /etc/init.d/iptable ...

  8. jdbc的实例应用:增删查改实现

    //在jdbc中进行增删查改 //查看所有 public static void findAll() { String url = "jdbc:mysql://localhost:3306/ ...

  9. Android SQLite最简单demo实现(增删查改)

    本来不太想写这篇博客的,但是看到网上的关于android数据库操作的博文都讲得很详细,对于像我这样的新手入门了解SQLite的基本操作有一定难度,所以我参考了网上的一些博客文章,并自己亲自摸索了一遍, ...

随机推荐

  1. angularjs link compile与controller的区别详解,了解angular生命周期

     壹 ❀ 引 我在 angularjs 一篇文章看懂自定义指令directive 一文中简单提及了自定义指令中的link链接函数与compile编译函数,并说到两者具有互斥特性,即同时存在link与c ...

  2. CSS权重的进制问题

    这是复习篇的第一个知识点,(CSS权重进制在IE6为256,后来扩大到了65536.而现代浏览器则采用更大的数量)在说这个知识点之前我们先来看一个例子 <!DOCTYPE html> &l ...

  3. 一起学SpringMVC之入门篇

    本文属于SpringMVC的入门篇,属于基础知识,仅供学习分享使用,如有不足之处,还请指正. 什么是SpringMVC ? SpringMVC是一个基于Spring的MVC框架,继承了Spring的优 ...

  4. C#爬虫例子

    公司需要抓取新闻,每次手动复制粘贴新闻,太麻烦了,业务人员就提出了要求,需要程序实现自动抓取新闻,因此就写了这个简单的爬虫程序. Html Agility Pack库 这是一个.NET下的HTML解析 ...

  5. jvm虚拟机笔记<二> 垃圾回收与内存分配

    确定对象已废弃需要两步: 利用可达性分析算法(与GC roots有关联——虚拟机栈中的对象,方法区静态对象,方法区常量对象,本地方法引用的对象)判断是否需要回收. 是否覆盖过finalize方法并执行 ...

  6. WM消息大全,windows消息大全

    WM消息大全 消息名 消息值 说明 WM_CREATE 0x0001 应用程序创建一个窗口 WM_DESTROY 0x0002 一个窗口被销毁 WM_MOVE 0x0003 移动一个窗口 WM_SIZ ...

  7. 资深架构师教你String 常量池、 String.itern()

    什么是常量 用final修饰的成员变量表示常量,值一旦给定就无法改变! final修饰的变量有三种:静态变量.实例变量和局部变量,分别表示三种类型的常量. Class文件中的常量池 在Class文件结 ...

  8. flutter 侧滑删除+侧滑显示删除按钮

    1.侧滑删除 1.1.Dismissible组件 2.侧滑显示删除按钮 2.1.手势监听水平滑动 ------------------------------------分割线------------ ...

  9. ArcGIS以数据库作为数据源作为source发布服务步骤详解(以Postgresql为例)及各种发布问题

    创建企业级数据库 Data Management Tools-->Geodatabase Administration-->Create Enterprise Geodatabase 按如 ...

  10. OC-AVAudioPlayer的使用小记

    - (void)viewDidLoad { [super viewDidLoad]; //设置音乐的后台播放,注意background mode中需要勾选上 AVAudioSession *sessi ...