经常需要对xml文件进行操作,参考了Jquery的链式操作后实现了xmlHelper类。

代码

using System;
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;
        }
    }
}

使用示例:

代码

string _configPath = "config.xml";
           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>
</configuration>

转载于:https://www.cnblogs.com/luckuny/archive/2011/02/22/1961255.html

仿Jquery链式操作的xml操作类相关推荐

  1. 刁肥宅手笔:纯C语言实现链式队列的相关操作

    先上图,以图服人: 图一 程序运行截图1 图二 程序运行截图2 上代码: 头文件LinkQueue.h: /*LinkQueue.h*/#ifndef LINKQUEUE_H_INCLUDED #de ...

  2. jquery链式写法 java_jQuery链式操作

    两个问题 1.jQuery的链式操作是如何实现的? 2.为什么要用链式操作? 大家认为这两个问题哪个好回答一点呢? 链式操作 原理相信百度一下一大把,实际上链式操作仅仅是通过对象上的方法最后 retu ...

  3. jQuery中事件及常用事件总结、jQuery中常见效果、隐式迭代、链式编程、样式操作、动画队列、不同元素绑定同一个事件

    jQuery事件: jQuery中的事件和javascript中的事件基本相似,不同的是jQuery中的事件处理函数写在事件后面的括号中,如: <script>$('input').cli ...

  4. jQuery链式操作[转]

    用过jQuery的朋友都知道他强大的链式操作,方便,简洁,易于理解,如下 $("has_children").click(function(){ $(this).addClass( ...

  5. 广义表的链式定义和基础操作

    广义表的定义 广义表(Lists,又称列表)是线性表的推广.线性表定义为n>=0个元素a1,a2,a3,-,an的有限序列.线性表的元素仅限于原子项,原子是作为结构上不可分割的成分,它可以是一个 ...

  6. 【C】二叉树--顺序结构(详解堆的实现,topK排序、堆排)、和链式结构(链式结构的遍历、链式结构常见递归操作以及练习题)

    本章我们将引入树的概念并详细介绍二叉树.我们会在介绍顺序二叉树基础上,进一步介绍堆以及堆的实现,并以此为依据详解topK排序.堆排等问题:然后我们会介绍链式二叉树的实现以及各种操作.最后,我们也会给出 ...

  7. 模拟jquery链式访问

    一直写代码写代码,博客都快荒废了,眼看一月要过完,不能不留下点记忆,嘿嘿,刚研究了下jquery的链式访问,这么好用的技能我赶紧get了下,研究后略微修改,模拟一个简单的链式访问,下面这段代码支持修改 ...

  8. JQuery链式操作简单的菜单列表

    看到这个简单的菜单demo,也是为了再看看JQuery对DOM的操作,一直都记不牢,特别是siblings()这个总是想不起来. 这次再过一遍JQuery,不管简单的还是复杂的demo 还是坚持练习一 ...

  9. 栈的链式存储及常用操作

    水水的实现一下链式栈. #include <cstdio> #include <iostream> #include <cstring> #include < ...

最新文章

  1. easyui 下拉框用法
  2. Tensorflow【实战Google深度学习框架】TensorFlow模型的保存与恢复加载
  3. 个人代码库のC#千千静听 - 桌面歌词 (功能模拟)
  4. 区块链BaaS云服务(16)天德链TDBC“泰山沙盒系统”
  5. Cisco 3550配置DHCP的实际经验
  6. element文件上传有文件但是后台接收为空_程序员提高篇:大规格文件(G)是如何做分片优化的?...
  7. 对于linux socket与epoll配合相关的一些心得记录
  8. ieda ts文件报错_使用TS开发微信小程序(1):环境搭建——VSCode+TS
  9. jdk8 HashMap初始化和扩容机制
  10. 常量池、栈、堆的比较
  11. 优酷土豆闪婚 婚后孩子是问题
  12. 小程序毕设作品之微信小程序点餐系统毕业设计(6)开题答辩PPT
  13. 放射技师计算机辅助诊断,基于CT影像的肺癌计算机辅助诊断关键技术研究
  14. 做平台玩手机创造内容,微软小冰的花式包抄
  15. java转正自我陈述_试用期转正个人工作述职报告合集
  16. MySQL学习笔记——第3章 数据表的管理和表中数据操纵
  17. java 实习生刚入职都会做些什么工作呢?
  18. quartz(一):quartz简介及使用
  19. MySQL实现排名、分组筛选、TopN问题
  20. 3000字梳理大数据开发流程及规范(建议收藏)

热门文章

  1. [转]被当做狗和鸡来驱赶的百姓
  2. 时序数据合并场景加速分析和实现 - 复合索引,窗口分组查询加速,变态递归加速...
  3. OC之ARC环境中的循环strong问题
  4. java String类 常用函数
  5. 约瑟夫环问题---循环单链表
  6. Stimulsoft reports .net中创建变量
  7. Android 为你的应用程序添加快捷方式【优先级高的快捷方式】
  8. 操作系统内存管理问题集锦
  9. 山西台达plc可编程控制器_可编程控制器2(PLC)控制原理
  10. Downloader Middlewares反反爬虫【学习笔记04】