c#操作xml帮助类分享(xml增删改查)

代码如下:

using System;
using System.Collections;
using System.Xml;

namespace Jb51.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);
}
}

/// <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;
}

/// <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 />

(0)

相关推荐

  • 基于C#实现XML文件读取工具类

    本文实例讲述了基于C#实现XML文件读取工具类.分享给大家供大家参考.具体如下: 这是我去年写的一个XML文件读取工具类,现在做了一些调整 基本能满足一般的XML文件读取需求. 更新: 2013年6月26日19:37 Fix了几个Bug,为所有方法添加单元测试,并运行通过:同时调整了几个方法的位置. /// <summary> /// Author: jiangxiaoqiang /// </summary> public class XmlReader { //=========

  • C#实现的XML操作类实例

    本文实例讲述了C#实现的XML操作类.分享给大家供大家参考.具体如下: 这里讲述了C#写的一个XML操作类,包括读取/插入/修改/删除. using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.W

  • C#实现的xml操作类完整实例

    本文实例讲述了C#实现的xml操作类,分享给大家供大家参考,具体如下: using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System

  • 深入C#中使用SqlDbType.Xml类型参数的使用详解

    在sql server2005以及之后的sql server中引入了Xml数据类型,在C#中使用Xml数据类型需要指定参数类型为SqlDbType,参数值类型需要用SqlXml,如下示例:假定有一种表A,A表有两个字段:ID 类型 int,Data 类型 Xml,我要用C#往表中插入一行记录: 复制代码 代码如下: static void InsertA(int aid, string contentXml){//ConnString是连接字符串,需要额外定义    using (SqlConn

  • 详解C#借助.NET框架中的XmlTextReader类读取XML的方法

    XmlTextReader 提供对 XML 数据流的只进只读访问.当前节点指读取器定位到的节点.使用任何读方法推进读取器并且属性反映当前节点的值. 此类实现 XmlReader 并符合 W3C 可扩展标记语言 (XML) 1.0 和"XML 中的命名空间"建议.XmlTextReader 提供以下功能: 执行格式良好的 XML 的规则. XmlTextReader 不提供数据验证. 检查 DocumentType 节点是否是格式良好的.XmlTextReader 检查 DTD 的格式是

  • C# 操作XML文档 使用XmlDocument类方法

    W3C制定了XML DOM标准.很多编程语言中多提供了支持W3C XML DOM标准的API.我在之前的文章中介绍过如何使用Javascript对XML文档进行加载与查询.在本文中,我来介绍一下.Net中的XmlDocument类.它支持并扩展了W3C XML DOM标准.它将整个XML文档都先装载进内存中,然后再对XML文档进行操作,所以如果XML文档内容过大,不建议使用XmlDocument类,因为会消耗过多内存.对于很大的XML文档,可以使用XmlReader类来读取.因为XmlReade

  • C#中使用XmlDocument类来创建和修改XML格式的数据文件

    通过XmlDocument类修改XML文档数据,通常需要以下几个主要步骤或其中几个步骤. (1)获取一个包含XML文档数据的XmlDocument类对象,通常有两种方法来实现这个功能: 通过XmlDocument类的构造函数创建不包含任何结点的空对象,常用默认构造函数. (2)通过XmlDocument类的ChildNodes和Item属性获取某个结点(XmlNode类型),通过XmlNode的Name.Value.InnerText等属性修改选中结点的数据. (3)通过XmlDocument类

  • C#实现XML与实体类之间相互转换的方法(序列化与反序列化)

    本文实例讲述了C#实现XML与实体类之间相互转换的方法.分享给大家供大家参考,具体如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Data; using System.Xml; using System.Xml.Serialization; /// <summary> /// Xml序列化与反序列化 //

  • C#自定义处理xml数据类实例

    本文实例讲述了C#自定义处理xml数据类.分享给大家供大家参考.具体分析如下: 这个C#类专门用户处理xml数据,可以大大简化xml的操作,类中封装了常用的xml操作,包括打开.读取xml数据,读取.写入节点数据,通过xpath读取节点数据,导出节点数据等等,还可以根据需要自己扩充类的功能. using System; using System.Data; using System.IO; using System.Xml; namespace DotNet.Utilities { public

  • C#写入对象或集合类型数据到xml文件的方法

    本文实例讲述了C#写入对象或集合类型数据到xml文件的方法.分享给大家供大家参考.具体实现方法如下: public static string SerializeToXmlString(object objectToSerialize) { MemoryStream memoryStream = new MemoryStream(); System.Xml.Serialization.XmlSerializer xmlSerializer = new System.Xml.Serializati

随机推荐