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 創(chuàng)建Xml文檔
/// <summary>
/// 創(chuàng)建一個帶有根節(jié)點的Xml文件
/// </summary>
/// <param name="FileName">Xml文件名稱</param>
/// <param name="rootName">根節(jié)點名稱</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>
/// 插入一個節(jié)點和它的若干子節(jié)點
/// </summary>
/// <param name="XmlFile">Xml文件路徑</param>
/// <param name="NewNodeName">插入的節(jié)點名稱</param>
/// <param name="HasAttributes">此節(jié)點是否具有屬性,True為有,F(xiàn)alse為無</param>
/// <param name="fatherNode">此插入節(jié)點的父節(jié)點,要匹配的XPath表達式(例如:"http://節(jié)點名//子節(jié)點名)</param>
/// <param name="htAtt">此節(jié)點的屬性,Key為屬性名,Value為屬性值</param>
/// <param name="htSubNode">子節(jié)點的屬性,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)//若此節(jié)點有屬性,則先添加屬性
{
SetAttributes(xmlelem, htAtt);
SetNodes(xmlelem.Name, xmldoc, xmlelem, htSubNode);//添加完此節(jié)點屬性后,再添加它的子節(jié)點和它們的InnerText
}
else
{
SetNodes(xmlelem.Name, xmldoc, xmlelem, htSubNode);//若此節(jié)點無屬性,那么直接添加它的子節(jié)點
}
root.AppendChild(xmlelem);
xmldoc.Save(XmlFile);
return true;
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
/// <summary>
/// 更新節(jié)點
/// </summary>
/// <param name="XmlFile">Xml文件路徑</param>
/// <param name="fatherNode">需要更新節(jié)點的上級節(jié)點,要匹配的XPath表達式(例如:"http://節(jié)點名//子節(jié)點名)</param>
/// <param name="htAtt">需要更新的屬性表,Key代表需要更新的屬性,Value代表更新后的值</param>
/// <param name="htSubNode">需要更新的子節(jié)點的屬性表,Key代表需要更新的子節(jié)點名字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>
/// 刪除指定節(jié)點下的子節(jié)點
/// </summary>
/// <param name="XmlFile">Xml文件路徑</param>
/// <param name="fatherNode">制定節(jié)點,要匹配的XPath表達式(例如:"http://節(jié)點名//子節(jié)點名)</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表達式的第一個節(jié)點(節(jié)點中的子元素同時會被刪除)
/// </summary>
/// <param name="xmlFileName">XML文檔完全文件名(包含物理路徑)</param>
/// <param name="xpath">要匹配的XPath表達式(例如:"http://節(jié)點名//子節(jié)點名</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)
{
//刪除節(jié)點
xmldoc.ParentNode.RemoveChild(xmlNode);
}
xmldoc.Save(xmlFileName); //保存到XML文檔
isSuccess = true;
}
catch (Exception ex)
{
throw ex; //這里可以定義你自己的異常處理
}
return isSuccess;
}
/// <summary>
/// 刪除匹配XPath表達式的第一個節(jié)點中的匹配參數(shù)xmlAttributeName的屬性
/// </summary>
/// <param name="xmlFileName">XML文檔完全文件名(包含物理路徑)</param>
/// <param name="xpath">要匹配的XPath表達式(例如:"http://節(jié)點名//子節(jié)點名</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節(jié)點中的所有屬性
foreach (XmlAttribute attribute in xmlNode.Attributes)
{
if (attribute.Name.ToLower() == xmlAttributeName.ToLower())
{
//節(jié)點中存在此屬性
xmlAttribute = attribute;
isExistsAttribute = true;
break;
}
}
if (isExistsAttribute)
{
//刪除節(jié)點中的屬性
xmlNode.Attributes.Remove(xmlAttribute);
}
}
xmldoc.Save(xmlFileName); //保存到XML文檔
isSuccess = true;
}
catch (Exception ex)
{
throw ex; //這里可以定義你自己的異常處理
}
return isSuccess;
}
/*柯樂義*/
/// <summary>
/// 刪除匹配XPath表達式的第一個節(jié)點中的所有屬性
/// </summary>
/// <param name="xmlFileName">XML文檔完全文件名(包含物理路徑)</param>
/// <param name="xpath">要匹配的XPath表達式(例如:"http://節(jié)點名//子節(jié)點名</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節(jié)點中的所有屬性
xmlNode.Attributes.RemoveAll();
}
xmldoc.Save(xmlFileName); //保存到XML文檔
isSuccess = true;
}
catch (Exception ex)
{
throw ex; //這里可以定義你自己的異常處理
}
return isSuccess;
}
#endregion
#region 私有方法
/// <summary>
/// 設(shè)置節(jié)點屬性
/// </summary>
/// <param name="xe">節(jié)點所處的Element</param>
/// <param name="htAttribute">節(jié)點屬性,Key代表屬性名稱,Value代表屬性值</param>
private void SetAttributes(XmlElement xe, Hashtable htAttribute)
{
foreach (DictionaryEntry de in htAttribute)
{
xe.SetAttribute(de.Key.ToString(), de.Value.ToString());
}
}
/// <summary>
/// 增加子節(jié)點到根節(jié)點下
/// </summary>
/// <param name="rootNode">上級節(jié)點名稱</param>
/// <param name="XmlDoc">Xml文檔</param>
/// <param name="rootXe">父根節(jié)點所屬的Element</param>
/// <param name="SubNodes">子節(jié)點屬性,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>
/// 更新節(jié)點屬性和子節(jié)點InnerText值???樂 義
/// </summary>
/// <param name="root">根節(jié)點名字</param>
/// <param name="htAtt">需要更改的屬性名稱和值</param>
/// <param name="htSubNode">需要更改InnerText的子節(jié)點名字和值</param>
private void UpdateNodes(XmlNodeList root, Hashtable htAtt, Hashtable htSubNode)
{
foreach (XmlNode xn in root)
{
xmlelem = (XmlElement)xn;
if (xmlelem.HasAttributes)//如果節(jié)點如屬性,則先更改它的屬性
{
foreach (DictionaryEntry de in htAtt)//遍歷屬性哈希表
{
if (xmlelem.HasAttribute(de.Key.ToString()))//如果節(jié)點有需要更改的屬性
{
xmlelem.SetAttribute(de.Key.ToString(), de.Value.ToString());//則把哈希表中相應(yīng)的值Value賦給此屬性Key
}
}
}
if (xmlelem.HasChildNodes)//如果有子節(jié)點,則修改其子節(jié)點的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存儲了需要更改的節(jié)點名稱,
{
xe.InnerText = de.Value.ToString();//htSubNode中的Value存儲了Key節(jié)點更新后的數(shù)據(jù)
}
}
}
}
}
}
#endregion
#region XML文檔節(jié)點查詢和讀取
/// <summary>
/// 選擇匹配XPath表達式的第一個節(jié)點XmlNode.
/// </summary>
/// <param name="xmlFileName">XML文檔完全文件名(包含物理路徑)</param>
/// <param name="xpath">要匹配的XPath表達式(例如:"http://節(jié)點名//子節(jié)點名")</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表達式的節(jié)點列表XmlNodeList.
/// </summary>
/// <param name="xmlFileName">XML文檔完全文件名(包含物理路徑)</param>
/// <param name="xpath">要匹配的XPath表達式(例如:"http://節(jié)點名//子節(jié)點名")</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表達式的第一個節(jié)點的匹配xmlAttributeName的屬性XmlAttribute. 柯樂義
/// </summary>
/// <param name="xmlFileName">XML文檔完全文件名(包含物理路徑)</param>
/// <param name="xpath">要匹配的XPath表達式(例如:"http://節(jié)點名//子節(jié)點名</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
}
}
這個類怎么使用呢?下面給出一個創(chuàng)建xml文檔的例子:
XmlHelper m_menu_keleyi_com = new XmlHelper();
m_menu_keleyi_com.CreateXmlDocument(@"D:\kel"+"eyimenu.xml", "ke"+"leyimenu", "utf-8");
這短代碼在D盤創(chuàng)建了一個名為keleyimenu.xml的文檔,文檔有根節(jié)點keleyimenu,文檔的內(nèi)容為:
<?xml version="1.0" encoding="utf-8"?>
<keleyimenu />
- C#實現(xiàn)的XML操作類實例
- C#實現(xiàn)XML與實體類之間相互轉(zhuǎn)換的方法(序列化與反序列化)
- C#中使用XmlDocument類來創(chuàng)建和修改XML格式的數(shù)據(jù)文件
- 詳解C#借助.NET框架中的XmlTextReader類讀取XML的方法
- C#寫入對象或集合類型數(shù)據(jù)到xml文件的方法
- 基于C#實現(xiàn)XML文件讀取工具類
- C#自定義處理xml數(shù)據(jù)類實例
- 深入C#中使用SqlDbType.Xml類型參數(shù)的使用詳解
- C# 操作XML文檔 使用XmlDocument類方法
- C#實現(xiàn)的xml操作類完整實例
相關(guān)文章
C#如何在窗體程序中操作數(shù)據(jù)庫數(shù)據(jù)
這篇文章主要介紹了C#如何在窗體程序中操作數(shù)據(jù)庫數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-04-04C#提示:“在證書存儲區(qū)中找不到清單簽名證書”的解決方法
這篇文章主要介紹了C#提示:“在證書存儲區(qū)中找不到清單簽名證書”的解決方法,分析了幾種常見的解決方案供大家選擇使用,具有一定參考借鑒價值,需要的朋友可以參考下2015-01-01C#中使用快速排序按文件創(chuàng)建時間將文件排序的源碼
C#中使用快速排序按文件創(chuàng)建時間將文件排序的源碼...2007-03-03C#與C++?dll之間傳遞字符串string?wchar_t*?char*?IntPtr問題
C#與C++?dll之間傳遞字符串string?wchar_t*?char*?IntPtr問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11C#獲取鼠標在listview右鍵點擊單元格的內(nèi)容方法
下面小編就為大家?guī)硪黄狢#獲取鼠標在listview右鍵點擊單元格的內(nèi)容方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01C#使用EF連接PGSql數(shù)據(jù)庫的完整步驟
這篇文章主要給大家介紹了關(guān)于C#使用EF連接PGSql數(shù)據(jù)庫的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧2019-01-01