文章出處

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");

  


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()