文章出處
文章列表
using System; using System.Collections; using System.Xml; namespace Services.Tool { public class XmlHelper { #region 公共變量 public static XmlDocument xmldoc; public static XmlNode xmlnode; public static 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 static 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 static 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 static 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 static 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 static 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 static 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 static 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 static 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 static 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 static 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 static 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 static 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 static 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 } } //XmlHelper m_menu_keleyi_com = new XmlHelper(); //m_menu_keleyi_com.CreateXmlDocument(@"D:\kel"+"eyimenu.xml", "ke"+"leyimenu", "utf-8");
文章列表
全站熱搜