仿Jquery链式操作的xml操作类
经常需要对xml文件进行操作,参考了Jquery的链式操作后实现了xmlHelper类。
using System.Data;
using System.Configuration;
using System.Xml;
namespace ConfigUpdate
{
/// <summary>
/// 调用非静态的操作方法的
/// </summary>
public class XmlHelper
{
private XmlDocument _doc;
private string _xmlPath;
public XmlHelper(string xmlPath)
{
_xmlPath = xmlPath;
_doc = new XmlDocument();
_doc.Load(xmlPath);
}
/// <summary>
/// 读取数据
/// </summary>
/// <param name="xmlPath">路径</param>
/// <param name="node">节点</param>
/// <param name="attribute">属性名,非空时返回该属性值,否则返回串联值</param>
/// <returns>string</returns>
public static string Select(string xmlPath, string node, string attribute)
{
XmlDocument doc = new XmlDocument();
doc.Load(xmlPath);
XmlNode xn = GetNode(doc, node);
string value = (String.IsNullOrEmpty(attribute) ? xn.InnerText : xn.Attributes[attribute].Value);
doc.Clone();
return value;
}
/// <summary>
/// 调用此方法后不再需要调用Execute方法。
/// </summary>
/// <param name="node"></param>
/// <param name="attribute"></param>
/// <returns></returns>
public string Select(string node, string attribute)
{
string value = String.Empty; ;
XmlNode xn = GetNode(_doc, node);
value = (String.IsNullOrEmpty(attribute) ? xn.InnerText : xn.Attributes[attribute].Value);
return value;
}
/// <summary>
/// 插入数据
/// </summary>
/// <param name="xmlPath">路径</param>
/// <param name="node">节点</param>
/// <param name="element">元素名,非空时插入新元素,否则在该元素中插入属性</param>
/// <param name="attribute">属性名,非空时插入该元素属性值,否则插入元素值</param>
/// <param name="value">值</param>
/// <returns></returns>
public XmlHelper Insert(string node, string element, string attribute, string value)
{
Add(_doc, _xmlPath, node, element, attribute, value);
return this;
}
public static void Insert(string xmlPath, string node, string element, string attribute, string value)
{
XmlDocument doc = new XmlDocument();
doc.Load(xmlPath);
Add(doc, xmlPath, node, element, attribute, value);
}
private static void Add(XmlDocument doc, string xmlPath, string node, string element, string attribute, string value)
{
XmlNode xn = GetNode(doc, node);
if (String.IsNullOrEmpty(element))
{
if (!String.IsNullOrEmpty(attribute))
{
XmlElement xe = (XmlElement)xn;
xe.SetAttribute(attribute, value);
}
}
else
{
XmlElement xe = doc.CreateElement(element);
if (String.IsNullOrEmpty(attribute))
xe.InnerText = value;
else
xe.SetAttribute(attribute, value);
xn.AppendChild(xe);
}
doc.Save(xmlPath);
}
/// <summary>
/// 修改数据
/// </summary>
/// <param name="xmlPath">路径</param>
/// <param name="node">节点</param>
/// <param name="attribute">属性名,非空时修改该节点属性值,否则修改节点值</param>
/// <param name="value">值</param>
/// <returns></returns>
public static void Update(string xmlPath, string node, string attribute, string value)
{
XmlDocument doc = new XmlDocument();
doc.Load(xmlPath);
Edit(doc, xmlPath, node, attribute, value);
}
/// <summary>
/// 插入一个节点或者属性
/// </summary>
/// <param name="node"></param>
/// <param name="attribute"></param>
/// <param name="value"></param>
/// <returns></returns>
public XmlHelper Update(string node, string attribute, string value)
{
Edit(_doc, _xmlPath, node, attribute, value);
return this;
}
private static void Edit(XmlDocument doc, string xmlPath, string node, string attribute, string value)
{
XmlNode xn = GetNode(doc, node);
XmlElement xe = (XmlElement)xn;
if (String.IsNullOrEmpty(attribute))
{
xe.InnerText = value;
}
else
{
xe.SetAttribute(attribute, value);
}
doc.Save(xmlPath);
}
/// <summary>
/// 删除数据
/// </summary>
/// <param name="xmlPath">路径</param>
/// <param name="node">节点如果是非根节点可使用多层节点表达式:nodelayer1>nodelayer2>nodelayer3</param>
/// <param name="attribute">属性名,非空时删除该节点属性值,否则删除节点值</param>
/// <param name="value">值</param>
/// <returns></returns>
public static void Remove(string xmlPath, string node, string attribute)
{
XmlDocument doc = new XmlDocument();
doc.Load(xmlPath);
Delete(doc, xmlPath, node, attribute);
}
public XmlHelper Delete(string node, string attribute)
{
Delete(_doc, _xmlPath, node, attribute);
return this;
}
private static void Delete(XmlDocument doc, string xmlPath, string node, string attribute)
{
XmlNode xn = GetNode(doc, node);
XmlElement xe = (XmlElement)xn;
if (String.IsNullOrEmpty(attribute))
{
xn.ParentNode.RemoveChild(xn);
}
else
{
xe.RemoveAttribute(attribute);
}
doc.Save(xmlPath);
}
/// <summary>
/// 返回节点
/// </summary>
/// <param name="doc"></param>
/// <param name="node">节点表达式</param>
/// <returns></returns>
private static XmlNode GetNode(XmlDocument doc, string node)
{
if (String.IsNullOrEmpty(node))
{
throw new ArgumentNullException("节点不能为空");
}
string[] nodelayers = node.Split('>');
XmlNode xn = doc.SelectSingleNode(nodelayers[0]);
for (int i = 1; i < nodelayers.Length; i++)
{
if (String.IsNullOrEmpty(nodelayers[i]))
{
throw new ArgumentException(String.Format("第{0}级节点为空",i+1));
}
else
{
xn = xn.SelectSingleNode(nodelayers[i]);
}
}
return xn;
}
}
}
使用示例:
XmlHelper.Insert(_configPath, "configuration","mynode",null,"kk");
string msg= new XmlHelper(_configPath)
.Insert("configuration", "mynode", null, "kk")
.Update("configuration>mynode", null, "zhao")
.Select("configuration>mynode", null);
MessageBox.Show(msg);
xml内容
<?xml version="1.0" encoding="utf-8"?>
</configuration>
转载于:https://www.cnblogs.com/luckuny/archive/2011/02/22/1961255.html
仿Jquery链式操作的xml操作类相关推荐
- 刁肥宅手笔:纯C语言实现链式队列的相关操作
先上图,以图服人: 图一 程序运行截图1 图二 程序运行截图2 上代码: 头文件LinkQueue.h: /*LinkQueue.h*/#ifndef LINKQUEUE_H_INCLUDED #de ...
- jquery链式写法 java_jQuery链式操作
两个问题 1.jQuery的链式操作是如何实现的? 2.为什么要用链式操作? 大家认为这两个问题哪个好回答一点呢? 链式操作 原理相信百度一下一大把,实际上链式操作仅仅是通过对象上的方法最后 retu ...
- jQuery中事件及常用事件总结、jQuery中常见效果、隐式迭代、链式编程、样式操作、动画队列、不同元素绑定同一个事件
jQuery事件: jQuery中的事件和javascript中的事件基本相似,不同的是jQuery中的事件处理函数写在事件后面的括号中,如: <script>$('input').cli ...
- jQuery链式操作[转]
用过jQuery的朋友都知道他强大的链式操作,方便,简洁,易于理解,如下 $("has_children").click(function(){ $(this).addClass( ...
- 广义表的链式定义和基础操作
广义表的定义 广义表(Lists,又称列表)是线性表的推广.线性表定义为n>=0个元素a1,a2,a3,-,an的有限序列.线性表的元素仅限于原子项,原子是作为结构上不可分割的成分,它可以是一个 ...
- 【C】二叉树--顺序结构(详解堆的实现,topK排序、堆排)、和链式结构(链式结构的遍历、链式结构常见递归操作以及练习题)
本章我们将引入树的概念并详细介绍二叉树.我们会在介绍顺序二叉树基础上,进一步介绍堆以及堆的实现,并以此为依据详解topK排序.堆排等问题:然后我们会介绍链式二叉树的实现以及各种操作.最后,我们也会给出 ...
- 模拟jquery链式访问
一直写代码写代码,博客都快荒废了,眼看一月要过完,不能不留下点记忆,嘿嘿,刚研究了下jquery的链式访问,这么好用的技能我赶紧get了下,研究后略微修改,模拟一个简单的链式访问,下面这段代码支持修改 ...
- JQuery链式操作简单的菜单列表
看到这个简单的菜单demo,也是为了再看看JQuery对DOM的操作,一直都记不牢,特别是siblings()这个总是想不起来. 这次再过一遍JQuery,不管简单的还是复杂的demo 还是坚持练习一 ...
- 栈的链式存储及常用操作
水水的实现一下链式栈. #include <cstdio> #include <iostream> #include <cstring> #include < ...
最新文章
- easyui 下拉框用法
- Tensorflow【实战Google深度学习框架】TensorFlow模型的保存与恢复加载
- 个人代码库のC#千千静听 - 桌面歌词 (功能模拟)
- 区块链BaaS云服务(16)天德链TDBC“泰山沙盒系统”
- Cisco 3550配置DHCP的实际经验
- element文件上传有文件但是后台接收为空_程序员提高篇:大规格文件(G)是如何做分片优化的?...
- 对于linux socket与epoll配合相关的一些心得记录
- ieda ts文件报错_使用TS开发微信小程序(1):环境搭建——VSCode+TS
- jdk8 HashMap初始化和扩容机制
- 常量池、栈、堆的比较
- 优酷土豆闪婚 婚后孩子是问题
- 小程序毕设作品之微信小程序点餐系统毕业设计(6)开题答辩PPT
- 放射技师计算机辅助诊断,基于CT影像的肺癌计算机辅助诊断关键技术研究
- 做平台玩手机创造内容,微软小冰的花式包抄
- java转正自我陈述_试用期转正个人工作述职报告合集
- MySQL学习笔记——第3章 数据表的管理和表中数据操纵
- java 实习生刚入职都会做些什么工作呢?
- quartz(一):quartz简介及使用
- MySQL实现排名、分组筛选、TopN问题
- 3000字梳理大数据开发流程及规范(建议收藏)