C# XML文件操作类XmlHelper
类的完整代码:
using System;
using System.Collections;
using System.Xml;
namespace Keleyi.Com.XmlDAL
{
public class XmlHelper
{
#region 公共变量
XmlDocument xmldoc;
XmlNode xmlnode;
XmlElement xmlelem;
#endregion
#region 创建Xml文档
/// <summary>
/// 创建一个带有根节点的Xml文件
/// </summary>
/// <param name="FileName">Xml文件名称</param>
/// <param name="rootName">根节点名称</param>
/// <param name="Encode">编码方式:gb2312,UTF-8等常见的</param>
/// <param name="DirPath">保存的目录路径</param>
/// <returns></returns>
public bool CreateXmlDocument(string FileName, string RootName, string Encode)
{
try
{
xmldoc = new XmlDocument();
XmlDeclaration xmldecl;
xmldecl = xmldoc.CreateXmlDeclaration("1.0", Encode,null);
xmldoc.AppendChild(xmldecl);
xmlelem = xmldoc.CreateElement("", RootName, "");
xmldoc.AppendChild(xmlelem);
xmldoc.Save(FileName);
return true;
}
catch (Exception e)
{
return false;
throw new Exception(e.Message);
}
}
#endregion
#region 常用操作方法(增删改)
/// <summary>
/// 插入一个节点和它的若干子节点
/// </summary>
/// <param name="XmlFile">Xml文件路径</param>
/// <param name="NewNodeName">插入的节点名称</param>
/// <param name="HasAttributes">此节点是否具有属性,True为有,False为无</param>
/// <param name="fatherNode">此插入节点的父节点,要匹配的XPath表达式(例如:"//节点名//子节点名)</param>
/// <param name="htAtt">此节点的属性,Key为属性名,Value为属性值</param>
/// <param name="htSubNode">子节点的属性,Key为Name,Value为InnerText</param>
/// <returns>返回真为更新成功,否则失败</returns>
public bool InsertNode(string XmlFile, string NewNodeName, bool HasAttributes, string fatherNode, Hashtable htAtt, Hashtable htSubNode)
{
try
{
xmldoc = new XmlDocument();
xmldoc.Load(XmlFile);
XmlNode root = xmldoc.SelectSingleNode(fatherNode);
xmlelem = xmldoc.CreateElement(NewNodeName);
if (htAtt != null && HasAttributes)//若此节点有属性,则先添加属性
{
SetAttributes(xmlelem, htAtt);
SetNodes(xmlelem.Name, xmldoc, xmlelem, htSubNode);//添加完此节点属性后,再添加它的子节点和它们的InnerText
}
else
{
SetNodes(xmlelem.Name, xmldoc, xmlelem, htSubNode);//若此节点无属性,那么直接添加它的子节点
}
root.AppendChild(xmlelem);
xmldoc.Save(XmlFile);
return true;
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
/// <summary>
/// 更新节点
/// </summary>
/// <param name="XmlFile">Xml文件路径</param>
/// <param name="fatherNode">需要更新节点的上级节点,要匹配的XPath表达式(例如:"//节点名//子节点名)</param>
/// <param name="htAtt">需要更新的属性表,Key代表需要更新的属性,Value代表更新后的值</param>
/// <param name="htSubNode">需要更新的子节点的属性表,Key代表需要更新的子节点名字Name,Value代表更新后的值InnerText</param>
/// <returns>返回真为更新成功,否则失败</returns>
public bool UpdateNode(string XmlFile, string fatherNode, Hashtable htAtt, Hashtable htSubNode)
{
try
{
xmldoc = new XmlDocument();
xmldoc.Load(XmlFile);
XmlNodeList root = xmldoc.SelectSingleNode(fatherNode).ChildNodes;
UpdateNodes(root, htAtt, htSubNode);
xmldoc.Save(XmlFile);
return true;
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
/// <summary>
/// 删除指定节点下的子节点
/// </summary>
/// <param name="XmlFile">Xml文件路径</param>
/// <param name="fatherNode">制定节点,要匹配的XPath表达式(例如:"//节点名//子节点名)</param>
/// <returns>返回真为更新成功,否则失败</returns>
public bool DeleteNodes(string XmlFile, string fatherNode)
{
try
{
xmldoc = new XmlDocument();
xmldoc.Load(XmlFile);
xmlnode = xmldoc.SelectSingleNode(fatherNode);
xmlnode.RemoveAll();
xmldoc.Save(XmlFile);
return true;
}
catch (XmlException xe)
{
throw new XmlException(xe.Message);
}
}
/*keleyi*/
/// <summary>
/// 删除匹配XPath表达式的第一个节点(节点中的子元素同时会被删除)
/// </summary>
/// <param name="xmlFileName">XML文档完全文件名(包含物理路径)</param>
/// <param name="xpath">要匹配的XPath表达式(例如:"//节点名//子节点名</param>
/// <returns>成功返回true,失败返回false</returns>
public bool DeleteXmlNodeByXPath(string xmlFileName, string xpath)
{
bool isSuccess = false;
xmldoc = new XmlDocument();
try
{
xmldoc.Load(xmlFileName); //加载XML文档
XmlNode xmlNode = xmldoc.SelectSingleNode(xpath);
if (xmlNode != null)
{
//删除节点
xmldoc.ParentNode.RemoveChild(xmlNode);
}
xmldoc.Save(xmlFileName); //保存到XML文档
isSuccess = true;
}
catch (Exception ex)
{
throw ex; //这里可以定义你自己的异常处理
}
return isSuccess;
}
/* keleyi.com */
/// <summary>
/// 删除匹配XPath表达式的第一个节点中的匹配参数xmlAttributeName的属性
/// </summary>
/// <param name="xmlFileName">XML文档完全文件名(包含物理路径)</param>
/// <param name="xpath">要匹配的XPath表达式(例如:"//节点名//子节点名</param>
/// <param name="xmlAttributeName">要删除的xmlAttributeName的属性名称</param>
/// <returns>成功返回true,失败返回false</returns>
public bool DeleteXmlAttributeByXPath(string xmlFileName, string xpath, string xmlAttributeName)
{
bool isSuccess = false;
bool isExistsAttribute = false;
xmldoc = new XmlDocument();
try
{
xmldoc.Load(xmlFileName); //加载XML文档
XmlNode xmlNode = xmldoc.SelectSingleNode(xpath);
XmlAttribute xmlAttribute = null;
if (xmlNode != null)
{
//遍历xpath节点中的所有属性
foreach (XmlAttribute attribute in xmlNode.Attributes)
{
if (attribute.Name.ToLower() == xmlAttributeName.ToLower())
{
//节点中存在此属性
xmlAttribute = attribute;
isExistsAttribute = true;
break;
}
}
if (isExistsAttribute)
{
//删除节点中的属性
xmlNode.Attributes.Remove(xmlAttribute);
}
}
xmldoc.Save(xmlFileName); //保存到XML文档
isSuccess = true;
}
catch (Exception ex)
{
throw ex; //这里可以定义你自己的异常处理
}
return isSuccess;
}
/*柯乐义*/
/// <summary>
/// 删除匹配XPath表达式的第一个节点中的所有属性
/// </summary>
/// <param name="xmlFileName">XML文档完全文件名(包含物理路径)</param>
/// <param name="xpath">要匹配的XPath表达式(例如:"//节点名//子节点名</param>
/// <returns>成功返回true,失败返回false</returns>
public bool DeleteAllXmlAttributeByXPath(string xmlFileName, string xpath)
{
bool isSuccess = false;
xmldoc = new XmlDocument();
try
{
xmldoc.Load(xmlFileName); //加载XML文档
XmlNode xmlNode = xmldoc.SelectSingleNode(xpath);
if (xmlNode != null)
{
//遍历xpath节点中的所有属性
xmlNode.Attributes.RemoveAll();
}
xmldoc.Save(xmlFileName); //保存到XML文档
isSuccess = true;
}
catch (Exception ex)
{
throw ex; //这里可以定义你自己的异常处理
}
return isSuccess;
}
#endregion
#region 私有方法
/// <summary>
/// 设置节点属性
/// </summary>
/// <param name="xe">节点所处的Element</param>
/// <param name="htAttribute">节点属性,Key代表属性名称,Value代表属性值</param>
private void SetAttributes(XmlElement xe, Hashtable htAttribute)
{
foreach (DictionaryEntry de in htAttribute)
{
xe.SetAttribute(de.Key.ToString(), de.Value.ToString());
}
}
/// <summary>
/// 增加子节点到根节点下
/// </summary>
/// <param name="rootNode">上级节点名称</param>
/// <param name="XmlDoc">Xml文档</param>
/// <param name="rootXe">父根节点所属的Element</param>
/// <param name="SubNodes">子节点属性,Key为Name值,Value为InnerText值</param>
private void SetNodes(string rootNode, XmlDocument XmlDoc, XmlElement rootXe, Hashtable SubNodes)
{
if (SubNodes == null)
return;
foreach (DictionaryEntry de in SubNodes)
{
xmlnode = XmlDoc.SelectSingleNode(rootNode);
XmlElement subNode = XmlDoc.CreateElement(de.Key.ToString());
subNode.InnerText = de.Value.ToString();
rootXe.AppendChild(subNode);
}
}
/// <summary>
/// 更新节点属性和子节点InnerText值。柯 乐 义
/// </summary>
/// <param name="root">根节点名字</param>
/// <param name="htAtt">需要更改的属性名称和值</param>
/// <param name="htSubNode">需要更改InnerText的子节点名字和值</param>
private void UpdateNodes(XmlNodeList root, Hashtable htAtt, Hashtable htSubNode)
{
foreach (XmlNode xn in root)
{
xmlelem = (XmlElement)xn;
if (xmlelem.HasAttributes)//如果节点如属性,则先更改它的属性
{
foreach (DictionaryEntry de in htAtt)//遍历属性哈希表
{
if (xmlelem.HasAttribute(de.Key.ToString()))//如果节点有需要更改的属性
{
xmlelem.SetAttribute(de.Key.ToString(), de.Value.ToString());//则把哈希表中相应的值Value赋给此属性Key
}
}
}
if (xmlelem.HasChildNodes)//如果有子节点,则修改其子节点的InnerText
{
XmlNodeList xnl = xmlelem.ChildNodes;
foreach (XmlNode xn1 in xnl)
{
XmlElement xe = (XmlElement)xn1;
foreach (DictionaryEntry de in htSubNode)
{
if (xe.Name == de.Key.ToString())//htSubNode中的key存储了需要更改的节点名称,
{
xe.InnerText = de.Value.ToString();//htSubNode中的Value存储了Key节点更新后的数据
}
}
}
}
}
}
#endregion
#region XML文档节点查询和读取
/**/
/// <summary>
/// 选择匹配XPath表达式的第一个节点XmlNode.
/// </summary>
/// <param name="xmlFileName">XML文档完全文件名(包含物理路径)</param>
/// <param name="xpath">要匹配的XPath表达式(例如:"//节点名//子节点名")</param>
/// <returns>返回XmlNode</returns>
public XmlNode GetXmlNodeByXpath(string xmlFileName, string xpath)
{
xmldoc = new XmlDocument();
try
{
xmldoc.Load(xmlFileName); //加载XML文档
XmlNode xmlNode = xmldoc.SelectSingleNode(xpath);
return xmlNode;
}
catch (Exception ex)
{
return null;
//throw ex; //这里可以定义你自己的异常处理
}
}
/**/
/// <summary>
/// 选择匹配XPath表达式的节点列表XmlNodeList.
/// </summary>
/// <param name="xmlFileName">XML文档完全文件名(包含物理路径)</param>
/// <param name="xpath">要匹配的XPath表达式(例如:"//节点名//子节点名")</param>
/// <returns>返回XmlNodeList</returns>
public XmlNodeList GetXmlNodeListByXpath(string xmlFileName, string xpath)
{
xmldoc = new XmlDocument();
try
{
xmldoc.Load(xmlFileName); //加载XML文档
XmlNodeList xmlNodeList = xmldoc.SelectNodes(xpath);
return xmlNodeList;
}
catch (Exception ex)
{
return null;
//throw ex; //这里可以定义你自己的异常处理
}
}
/**/
/// <summary>
/// 选择匹配XPath表达式的第一个节点的匹配xmlAttributeName的属性XmlAttribute. 柯乐义
/// </summary>
/// <param name="xmlFileName">XML文档完全文件名(包含物理路径)</param>
/// <param name="xpath">要匹配的XPath表达式(例如:"//节点名//子节点名</param>
/// <param name="xmlAttributeName">要匹配xmlAttributeName的属性名称</param>
/// <returns>返回xmlAttributeName</returns>
public XmlAttribute GetXmlAttribute(string xmlFileName, string xpath, string xmlAttributeName)
{
string content = string.Empty;
xmldoc = new XmlDocument();
XmlAttribute xmlAttribute = null;
try
{
xmldoc.Load(xmlFileName); //加载XML文档
XmlNode xmlNode = xmldoc.SelectSingleNode(xpath);
if (xmlNode != null)
{
if (xmlNode.Attributes.Count > 0)
{
xmlAttribute = xmlNode.Attributes[xmlAttributeName];
}
}
}
catch (Exception ex)
{
throw ex; //这里可以定义你自己的异常处理
}
return xmlAttribute;
}
#endregion
}
}
这个类怎么使用呢?下面给出一个创建xml文档的例子:
XmlHelper m_menu_keleyi_com = new XmlHelper();
m_menu_keleyi_com.CreateXmlDocument(@"D:\kel"+"eyimenu.xml", "ke"+"leyimenu", "utf-8");
这短代码在D盘创建了一个名为keleyimenu.xml的文档,文档有根节点keleyimenu,文档的内容为:
<?xml version="1.0" encoding="utf-8"?>
<keleyimenu />
本篇则在上篇创建的xml文档中增加了节点。
代码如下:
XmlHelper m_menu_keleyi_com = new XmlHelper();
Hashtable m_ht = new Hashtable();
m_ht.Add("url", "http://keleyi.com/menu/csharp/");
m_ht.Add("text", "C#");
return m_menu_keleyi_com.InsertNode(@"D:\kel" + "eyimenu.xml", "csharp", true, "keleyimenu", m_ht, null);
当然需要引用命名空间:
using Keleyi.Com.XmlDAL;
结果xml文件keleyimenu.xml的内容为:
<?xml version="1.0" encoding="utf-8"?>
<keleyimenu>
<csharp text="C#" url="http://keleyi.com/menu/csharp/" />
</keleyimenu>
上一篇已经在根节点下添加了节点csharp,现在来获取该节点,已经该节点的属性值。
代码如下:
string m_nodeName = "csharp";
XmlNode m_menuNode_keleyi_com = m_menu_keleyi_com.GetXmlNodeByXpath(@"D:\kel" + "eyimenu.xml", "//kele"+"yimenu//"+m_nodeName);
string m_nodeText = m_menuNode_keleyi_com.Attributes["text"].Value;
string m_nodeUrl = m_menuNode_keleyi_com.Attributes["url"].Value;
那么现在m_nodeText的值为c#
而m_nodeUrl的值为:http://keleyi.com/menu/csharp/
C# XML文件操作类XmlHelper的更多相关文章
- XML文件操作类--创建XML文件
这个类是在微软XML操作类库上进行的封装,只是为了更加简单使用,包括XML类创建节点的示例. using System; using System.Collections; using System. ...
- PHP对XML文件操作类讲解
<?phpclass XML{ private $dom; function __construct () { $this->dom = new D ...
- (Unity)XML文件读写与IO文件操作类使用介绍
using System.Xml; //xml文件操作命名空间 #region 写入操作 void WriteXMLFile(string _fileName) { Xm ...
- Xml通用操作类
using System; using System.Collections.Generic; using System.IO; using System.Text; using System.Xml ...
- [C#] 常用工具类——文件操作类
/// <para> FilesUpload:工具方法:ASP.NET上传文件的方法</para> /// <para> FileExists:返回文件是否存在&l ...
- asp.net文件操作类
/** 文件操作类 **/ #region 引用命名空间 using System; using System.Collections.Generic; using System.Text; usin ...
- C# 文件操作类大全
C# 文件操作类大全 时间:2015-01-31 16:04:20 阅读:1724 评论:0 收藏:0 [点我收藏+] 标签: 1.创建文件夹 //usin ...
- Java文件操作类效率对比
前言 众所周知,Java中有多种针对文件的操作类,以面向字节流和字符流可分为两大类,这里以写入为例: 面向字节流的:FileOutputStream 和 BufferedOutputStream 面向 ...
- ASP.NET 文件操作类
1.读取文件 2.写入文件 using System; using System.Collections.Generic; using System.IO; using System.Linq; us ...
随机推荐
- 在前台运行Service
一个前台的 service是被用户强烈关注的从而不会在内存低时被系统杀死.前台 service必须在状态栏上提供一个通知,这个通知被放在"正在进行"区域中,这表示这个通知不能被解除,除非服务停止了或者 ...
- Gitolite 构建 Git 服务器
Gitolite 构建 Git 服务器 Gitolite 构建 Git 服务器作者: 北京群英汇信息技术有限公司网址: http://www.ossxp.com/版本: 0.1-1日期: 2010-1 ...
- bzoj1260
很容易脑补出来的区间dp O(n3)的 var f:array[0..51,0..51] of longint; i,n,j,l,k:longint; s:string; function ...
- HDOJ/HDU 2562 奇偶位互换(交换位置~)
Problem Description 给定一个长度为偶数位的0,1字符串,请编程实现串的奇偶位互换. Input 输入包含多组测试数据: 输入的第一行是一个整数C,表示有C测试数据: 接下来是C组测 ...
- HDOJ(HDU) 4847 Wow! Such Doge!(doge字符统计)
Problem Description Chen, Adrian (November 7, 2013). "Doge Is An Ac- tually Good Internet Meme. ...
- java 泛型学习
http://blog.csdn.net/archie2010/article/details/6232228 学习集合框架的时候经常用hasmap<Integer,Integer>就是泛 ...
- 编译android的linux kernel goldfish
https://source.android.com/source/building-kernels.html $ export PATH=/home/hzh/oldhome/learn/androi ...
- [置顶] Linux高编之进程--------fork函数的同步与异步(兄弟子进程和父子孙进程示列)
前面讲述的fork函数的基本用法,下面通过两个程序来说明fork函数同步与异步之间的关系: <1>通过fork函数实现在父进程下的四个兄弟子进程(即异步) : 函数实现代码: #inclu ...
- c#语言基础编程-转义符
C#转义字符: 引言 为了在程序中能够控制字符的输出以及区分开双引号和单引号(双引号和单引号在程序中标示里面的内容为字符串和字符),所以用一种特殊的字符常量:是·以反斜线"\"开头 ...
- C#中的线程(下)-多线程
1. 单元模式和Windows Forms 单元模式线程是一个自动线程安全机制, 非常贴近于COM——Microsoft的遗留下的组件对象模型.尽管.NET最大地放弃摆脱了遗留下的模型,但很多时候它 ...