首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

.NET 操作 XML 完整工具類:建立、新增、讀取節點與屬性

     編輯:關於.NET

封裝常用 XML 操作的靜態工具類,涵蓋 `XmlTextWriter` 建立檔案、`XmlDocument` 新增/讀取節點與屬性、完整例外處理。

完整程式碼

using System;
using System.Xml;
using System.Web;

namespace BLL
{
    public class XmlHelper
    {
        #region 建立 XML 檔案
        /// 
        /// 建立新的 XML 檔案,寫入根元素與宣告
        /// 
        /// 實體路徑 (Server.MapPath 解析後)
        /// 根元素名稱
        public static void CreateXmlFile(string xmlPath, string rootElement)
        {
            using (XmlTextWriter writer = new XmlTextWriter(xmlPath, System.Text.Encoding.UTF8))
            {
                writer.Formatting = Formatting.Indented;
                writer.WriteStartDocument();
                writer.WriteStartElement(rootElement);
                writer.WriteEndElement();
            }
        }
        #endregion

        #region 新增節點
        /// 
        /// 在指定 XPath 節點下新增子節點 (傳入 XmlNode)
        /// 
        public static void AddNode(string xmlPath, string parentXPath, XmlNode childNode)
        {
            XmlDocument doc = LoadDocument(xmlPath);
            XmlNode parent = doc.SelectSingleNode(parentXPath);
            if (parent != null)
            {
                XmlNode imported = doc.ImportNode(childNode, true);
                parent.AppendChild(imported);
                doc.Save(xmlPath);
            }
        }

        /// 
        /// 在指定 XPath 節點下新增元素與屬性
        /// 
        public static void AddElement(string xmlPath, string parentXPath, string elementName, string attributeName, string attributeValue)
        {
            XmlDocument doc = LoadDocument(xmlPath);
            XmlNode parent = doc.SelectSingleNode(parentXPath);
            if (parent != null)
            {
                XmlElement elem = doc.CreateElement(elementName);
                elem.SetAttribute(attributeName, attributeValue);
                parent.AppendChild(elem);
                doc.Save(xmlPath);
            }
        }
        #endregion

        #region 讀取操作
        private static XmlDocument LoadDocument(string xmlPath)
        {
            string physicalPath = HttpContext.Current != null 
                ? HttpContext.Current.Server.MapPath(xmlPath) 
                : xmlPath;
            XmlDocument doc = new XmlDocument();
            doc.Load(physicalPath);
            return doc;
        }

        /// 取得完整 XmlDocument
        public static XmlDocument GetDocument(string xmlPath)
        {
            try { return LoadDocument(xmlPath); }
            catch (XmlException) { throw; }
            catch (System.IO.IOException) { throw; }
        }

        /// 依 XPath 取得單一 XmlNode
        public static XmlNode GetNode(string xmlPath, string xPath)
        {
            try { return LoadDocument(xmlPath).SelectSingleNode(xPath); }
            catch (XPathException) { throw; }
            catch (XmlException) { throw; }
            catch (System.IO.IOException) { throw; }
        }

        /// 依 XPath 取得子元素 XmlElement
        public static XmlElement GetElement(string xmlPath, string parentXPath, string childElementName)
        {
            try 
            {
                XmlNode parent = LoadDocument(xmlPath).SelectSingleNode(parentXPath);
                return parent?[childElementName] as XmlElement;
            }
            catch (XPathException) { throw; }
            catch (XmlException) { throw; }
            catch (System.IO.IOException) { throw; }
        }

        /// 讀取節點屬性值
        public static string GetAttribute(string xmlPath, string xPath, string attributeName)
        {
            try 
            {
                XmlNode node = LoadDocument(xmlPath).SelectSingleNode(xPath);
                return node?.Attributes[attributeName]?.Value;
            }
            catch (XPathException) { throw; }
            catch (XmlException) { throw; }
            catch (System.IO.IOException) { throw; }
        }
        #endregion
    }
}

使用範例

// 1. 建立檔案
XmlHelper.CreateXmlFile(Server.MapPath("~/App_Data/Config.xml"), "Settings");

// 2. 新增節點
XmlDocument doc = new XmlDocument();
XmlElement dbNode = doc.CreateElement("Database");
dbNode.SetAttribute("Provider", "SqlServer");
XmlHelper.AddNode(Server.MapPath("~/App_Data/Config.xml"), "/Settings", dbNode);

// 3. 新增帶屬性元素
XmlHelper.AddElement(Server.MapPath("~/App_Data/Config.xml"), "/Settings", "Connection", "Name", "Default");

// 4. 讀取
string provider = XmlHelper.GetAttribute(Server.MapPath("~/App_Data/Config.xml"), "/Settings/Database", "Provider");
XmlElement connElem = XmlHelper.GetElement(Server.MapPath("~/App_Data/Config.xml"), "/Settings", "Connection");

設計重點

  • 統一使用 `XmlDocument` (DOM) 操作,適合中小型 XML
  • 路徑自動支援 `Server.MapPath` 虛擬路徑與實體路徑
  • 例外保留原始堆疊,方便上層統一錯誤處理
  • 方法命名語意化:`Create`/`Add`/`Get` 動詞前綴

大型 XML 或高效能需求請改用 `XmlReader`/`XmlWriter` 串流模式或 `LINQ to XML` (`XDocument`)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved