1. 程式人生 > >C# XML操作類 XmlHelper

C# XML操作類 XmlHelper

using System.Xml;
using System.Data;

namespace DotNet.Utilities
{
    /// <summary>
    /// Xml的操作公共類
    /// </summary>   
    public class XmlHelper
    {
        #region 欄位定義
        /// <summary>
        /// XML檔案的物理路徑
        /// </summary>
        private string _filePath = string.Empty;
        /// <summary>
        /// Xml文件
        /// </summary>
        private XmlDocument _xml;
        /// <summary>
        /// XML的根節點
        /// </summary>
        private XmlElement _element;
        #endregion

        #region 構造方法
        /// <summary>
        /// 例項化XmlHelper物件
        /// </summary>
        /// <param name="xmlFilePath">Xml檔案的相對路徑</param>
        public XmlHelper(string xmlFilePath)
        {
            //獲取XML檔案的絕對路徑
            _filePath = SysHelper.GetPath(xmlFilePath);
        }
        #endregion

        #region 建立XML的根節點
        /// <summary>
        /// 建立XML的根節點
        /// </summary>
        private void CreateXMLElement()
        {

            //建立一個XML物件
            _xml = new XmlDocument();

            if (DirFile.IsExistFile(_filePath))
            {
                //載入XML檔案
                _xml.Load(this._filePath);
            }

            //為XML的根節點賦值
            _element = _xml.DocumentElement;
        }
        #endregion

        #region 獲取指定XPath表示式的節點物件
        /// <summary>
        /// 獲取指定XPath表示式的節點物件
        /// </summary>       
        /// <param name="xPath">XPath表示式,
        /// 範例1: @"Skill/First/SkillItem", 等效於 @"//Skill/First/SkillItem"
        /// 範例2: @"Table[USERNAME='a']" , []表示篩選,USERNAME是Table下的一個子節點.
        /// 範例3: @"ApplyPost/Item[@itemName='崗位編號']",@itemName是Item節點的屬性.
        /// </param>
        public XmlNode GetNode(string xPath)
        {
            //建立XML的根節點
            CreateXMLElement();

            //返回XPath節點
            return _element.SelectSingleNode(xPath);
        }
        #endregion

        #region 獲取指定XPath表示式節點的值
        /// <summary>
        /// 獲取指定XPath表示式節點的值
        /// </summary>
        /// <param name="xPath">XPath表示式,
        /// 範例1: @"Skill/First/SkillItem", 等效於 @"//Skill/First/SkillItem"
        /// 範例2: @"Table[USERNAME='a']" , []表示篩選,USERNAME是Table下的一個子節點.
        /// 範例3: @"ApplyPost/Item[@itemName='崗位編號']",@itemName是Item節點的屬性.
        /// </param>
        public string GetValue(string xPath)
        {
            //建立XML的根節點
            CreateXMLElement();

            //返回XPath節點的值
            return _element.SelectSingleNode(xPath).InnerText;
        }
        #endregion

        #region 獲取指定XPath表示式節點的屬性值
        /// <summary>
        /// 獲取指定XPath表示式節點的屬性值
        /// </summary>
        /// <param name="xPath">XPath表示式,
        /// 範例1: @"Skill/First/SkillItem", 等效於 @"//Skill/First/SkillItem"
        /// 範例2: @"Table[USERNAME='a']" , []表示篩選,USERNAME是Table下的一個子節點.
        /// 範例3: @"ApplyPost/Item[@itemName='崗位編號']",@itemName是Item節點的屬性.
        /// </param>
        /// <param name="attributeName">屬性名</param>
        public string GetAttributeValue(string xPath, string attributeName)
        {
            //建立XML的根節點
            CreateXMLElement();

            //返回XPath節點的屬性值
            return _element.SelectSingleNode(xPath).Attributes[attributeName].Value;
        }
        #endregion

        #region 新增節點
        /// <summary>
        /// 1. 功能:新增節點。
        /// 2. 使用條件:將任意節點插入到當前Xml檔案中。
        /// </summary>       
        /// <param name="xmlNode">要插入的Xml節點</param>
        public void AppendNode(XmlNode xmlNode)
        {
            //建立XML的根節點
            CreateXMLElement();

            //匯入節點
            XmlNode node = _xml.ImportNode(xmlNode, true);

            //將節點插入到根節點下
            _element.AppendChild(node);
        }

        /// <summary>
        /// 1. 功能:新增節點。
        /// 2. 使用條件:將DataSet中的第一條記錄插入Xml檔案中。
        /// </summary>       
        /// <param name="ds">DataSet的例項,該DataSet中應該只有一條記錄</param>
        public void AppendNode(DataSet ds)
        {
            //建立XmlDataDocument物件
            XmlDataDocument xmlDataDocument = new XmlDataDocument(ds);

            //匯入節點
            XmlNode node = xmlDataDocument.DocumentElement.FirstChild;

            //將節點插入到根節點下
            AppendNode(node);
        }
        #endregion

        #region 刪除節點
        /// <summary>
        /// 刪除指定XPath表示式的節點
        /// </summary>       
        /// <param name="xPath">XPath表示式,
        /// 範例1: @"Skill/First/SkillItem", 等效於 @"//Skill/First/SkillItem"
        /// 範例2: @"Table[USERNAME='a']" , []表示篩選,USERNAME是Table下的一個子節點.
        /// 範例3: @"ApplyPost/Item[@itemName='崗位編號']",@itemName是Item節點的屬性.
        /// </param>
        public void RemoveNode(string xPath)
        {
            //建立XML的根節點
            CreateXMLElement();

            //獲取要刪除的節點
            XmlNode node = _xml.SelectSingleNode(xPath);

            //刪除節點
            _element.RemoveChild(node);
        }
        #endregion //刪除節點

        #region 儲存XML檔案
        /// <summary>
        /// 儲存XML檔案
        /// </summary>       
        public void Save()
        {
            //建立XML的根節點
            CreateXMLElement();

            //儲存XML檔案
            _xml.Save(this._filePath);
        }
        #endregion //儲存XML檔案

        #region 靜態方法

        #region 建立根節點物件
        /// <summary>
        /// 建立根節點物件
        /// </summary>
        /// <param name="xmlFilePath">Xml檔案的相對路徑</param>       
        private static XmlElement CreateRootElement(string xmlFilePath)
        {
            //定義變數,表示XML檔案的絕對路徑
            string filePath = "";

            //獲取XML檔案的絕對路徑
            filePath = SysHelper.GetPath(xmlFilePath);

            //建立XmlDocument物件
            XmlDocument xmlDocument = new XmlDocument();
            //載入XML檔案
            xmlDocument.Load(filePath);

            //返回根節點
            return xmlDocument.DocumentElement;
        }
        #endregion

        #region 獲取指定XPath表示式節點的值
        /// <summary>
        /// 獲取指定XPath表示式節點的值
        /// </summary>
        /// <param name="xmlFilePath">Xml檔案的相對路徑</param>
        /// <param name="xPath">XPath表示式,
        /// 範例1: @"Skill/First/SkillItem", 等效於 @"//Skill/First/SkillItem"
        /// 範例2: @"Table[USERNAME='a']" , []表示篩選,USERNAME是Table下的一個子節點.
        /// 範例3: @"ApplyPost/Item[@itemName='崗位編號']",@itemName是Item節點的屬性.
        /// </param>
        public static string GetValue(string xmlFilePath, string xPath)
        {
            //建立根物件
            XmlElement rootElement = CreateRootElement(xmlFilePath);

            //返回XPath節點的值
            return rootElement.SelectSingleNode(xPath).InnerText;
        }
        #endregion

        #region 獲取指定XPath表示式節點的屬性值
        /// <summary>
        /// 獲取指定XPath表示式節點的屬性值
        /// </summary>
        /// <param name="xmlFilePath">Xml檔案的相對路徑</param>
        /// <param name="xPath">XPath表示式,
        /// 範例1: @"Skill/First/SkillItem", 等效於 @"//Skill/First/SkillItem"
        /// 範例2: @"Table[USERNAME='a']" , []表示篩選,USERNAME是Table下的一個子節點.
        /// 範例3: @"ApplyPost/Item[@itemName='崗位編號']",@itemName是Item節點的屬性.
        /// </param>
        /// <param name="attributeName">屬性名</param>
        public static string GetAttributeValue(string xmlFilePath, string xPath, string attributeName)
        {
            //建立根物件
            XmlElement rootElement = CreateRootElement(xmlFilePath);

            //返回XPath節點的屬性值
            return rootElement.SelectSingleNode(xPath).Attributes[attributeName].Value;
        }
        #endregion

        #endregion

        public static void SetValue(string xmlFilePath, string xPath, string newtext)
        {
            //string path = SysHelper.GetPath(xmlFilePath);
            //var queryXML = from xmlLog in xelem.Descendants("msg_log")
            //               //所有名字為Bin的記錄
            //               where xmlLog.Element("user").Value == "Bin"
            //               select xmlLog;

            //foreach (XElement el in queryXML)
            //{
            //    el.Element("user").Value = "LiuBin";//開始修改
            //}
            //xelem.Save(path);
        }
    }
}