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 > )
{
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增删查改的更多相关文章
- java中CRUD(增删查改)底层代码的实现
java中CRUD(增删查改)底层代码的实现: package com.station.dao; import com.station.model.Product; import java.sql.* ...
- js中数组增删查改unshift、push、pop、shift、slice、indexOf、concat、join
js中数组增删查改unshift.push.pop.shift.slice.indexOf.concat.join
- MongoDB 学习笔记(二):shell中执行增删查改
一.查 1.查询集合中所有文档:db.集合名.find(). 2.查询集合中第一个文档:db.集合名.findOne(). 3.指定查询条件:第一个参数就是指定查询条件 查询全部文档:db.集合名.f ...
- C# xml增删查改
C# XML XmlDocument 添加命名空间: using System.Xml; 定义公共对象: XmlDocument xmldoc ; XmlNode xmlnode ; XmlEleme ...
- linq to xml 增删查改
一.XML基本概述 XML文件是一种常用的文件格式,例如WinForm里面的app.config以及Web程序中的web.config文件,还有许多重要的场所都有它的身影.Xml是Internet环境 ...
- XML 增删查改
<?xml version="1.0" encoding="utf-8"?> <users> <person name=" ...
- Ubuntu 中 iptables 增删查改
iptables是linux系统自带的防火墙,功能强大.如果iptables不熟悉的话可以用apf,是一款基于iptables的防墙. 一.安装并启动防火墙 $ /etc/init.d/iptable ...
- jdbc的实例应用:增删查改实现
//在jdbc中进行增删查改 //查看所有 public static void findAll() { String url = "jdbc:mysql://localhost:3306/ ...
- Android SQLite最简单demo实现(增删查改)
本来不太想写这篇博客的,但是看到网上的关于android数据库操作的博文都讲得很详细,对于像我这样的新手入门了解SQLite的基本操作有一定难度,所以我参考了网上的一些博客文章,并自己亲自摸索了一遍, ...
随机推荐
- 用了 Lambda 之后,发现可以忘记设计模式了
设计模式是过去的一些好的经验和套路的总结,但是好的语言特性可以让开发者不去考虑这些设计模式.面向对象常见的设计模式有策略模式.模板方法.观察者模式.责任链模式以及工厂模式,使用Lambda表达式(函数 ...
- python - selenium模块简介
为什么要使用Selenium? 很多浏览器渲染页面的方式都很难找出其规律, 但是利用Selenium来驱动加载网页就可以直接拿到javaScript渲染后的结果了, 不需要再担心其相关的加密系统 声明 ...
- 获取windows操作系统所有用户
一.知识点简单介绍 1. 利用WindowsApi获取 [DllImport("Netapi32.dll ")] extern static int NetUserEnum([Ma ...
- 周会材料:高并发程序设计<二>
第三章 JDK并发包https://www.cnblogs.com/sean-zeng/p/11957569.html JDK内部提供了大量实用的API和框架.本章主要介绍这些JDK内部功能,主要分为 ...
- Vue-element-admin实现菜单根据用户权限动态加载
之前有一些网友对我那个IT部门信息管理系统(http://caijt.com/it)的前端感兴趣,我已经开源到github(https://github.com/Caijt/itsys-ui) 上面有 ...
- Winform巧用窗体设计完成弹窗数值绑定-以重命名弹窗为例
场景 在WIinform中有一种场景就是对文件进行重命名时需要获取原来的名字并填充窗体中的输入框, 然后在点击保存时还要能获取弹窗中输入框的内容. 比如点击重命名时弹窗 点击确认时获取输入框内容. 注 ...
- ArcGIS api for JavaScript 3.27 在线浏览的一些小部件
var navOption; var navToolbar;// 当前选择的操作 require( [ "esri/toolbars/navigation", "esri ...
- Java - IO System类支持和缓冲流
System类的支持和缓冲流 System类对IO的支持 在System类中,为了支持IO操作提供了三个常量: 错误输出: public static final PrintStream err; 输 ...
- [转]RPA认证 Developer UIPath Certificate,细说uipath认证学习,Online Quiz和Practical Exam项目详解
本文转自:https://blog.csdn.net/u010369735/article/details/88621195 UIPath,RPA里算是比较简单易操作的一款软件了,因为公司业务的需要, ...
- UIView创建xib
这里有两种类都可以实现,但是推荐用Empty类来创建 (Empty): 参考链接:https://blog.csdn.net/wtdask/article/details/76439295 https ...