1. 程式人生 > WINDOWS開發 >WPF 讀寫XML檔案

WPF 讀寫XML檔案

程式集整體框架如下:

技術分享圖片

其中XmlReader類如下:

技術分享圖片
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;

namespace WpfApp4
{
    public class XmlReader
    {
        private static XmlDocument doc = new XmlDocument();
        private static string fileurl;
        //檔案路徑
        public static
string FileUrl { set { fileurl = value; } get { return fileurl; } } /// <summary> /// 載入Xml檔案 /// </summary> /// <param name="url">Xml檔案路徑</param> public static void LoadXml(string url) { doc.Load(url); }
/// <summary> /// 獲取XmlDocument的根節點 /// </summary> /// <returns>返回的XmlElement元素根節點</returns> public static XmlElement GetXmlDocumentRoot() { return doc.DocumentElement; } /// <summary> /// 獲取指定元素的指定Attribute值
/// </summary> /// <param name="xe">表示一個XmlElement</param> /// <param name="attr">表示Attribute的名字</param> /// <returns>返回獲取的Attribute的值</returns> public static string GetAttribute(XmlElement xe,string attr) { return xe.GetAttribute(attr); } /// <summary> /// 獲取指定節點的指定Attribute值 /// </summary> /// <param name="xn">表示一個XmlNode</param> /// <param name="attr"></param> /// <returns>返回獲取的Attribute的值</returns> public static string GetAttribute(XmlNode xn,string attr) { XmlElement xe = ExchangeNodeElement(xn); return xe.GetAttribute(attr); } /// <summary> /// XmlElement物件轉換成XmlNode物件 /// </summary> /// <param name="xe">XmlElement物件</param> /// <returns>返回XmlNode物件</returns> public static XmlNode ExchangeNodeElement(XmlElement xe) { return (XmlNode)xe; } /// <summary> /// XmlNode物件轉換成XmlElement物件 /// </summary> /// <param name="xe">XmlNode物件</param> /// <returns>返回XmlElement物件</returns> public static XmlElement ExchangeNodeElement(XmlNode xn) { return (XmlElement)xn; } /// <summary> /// 獲取節點的文字 /// </summary> /// <param name="xn"></param> /// <param name="nodename">節點的名稱</param> /// <returns></returns> public static string GetXmlNodeInnerText(XmlNode xn,string nodename) { XmlNode childxn = xn.SelectSingleNode(nodename); return childxn.InnerText; } /// <summary> /// 獲取指定節點的子節點 /// </summary> /// <param name="xn">節點物件</param> /// <returns>返回子節點數</returns> public static int GetXmlNodeCount(XmlNode xn) { return xn.ChildNodes.Count; } /// <summary> /// 獲取元素的文字 /// </summary> /// <param name="xn">XmlElement元素</param> /// <param name="nodename">元素的名稱</param> /// <returns></returns> public static string GetXmlElementInnerText(XmlElement xn,string nodename) { XmlNode childxn = xn.SelectSingleNode(nodename); return childxn.InnerText; } /// <summary> /// 獲取XmlNode是否具有指定Attribute值 /// </summary> /// <param name="xn">XmlNode物件</param> /// <param name="attr">Attribute的名稱</param> /// <param name="compare">Attribute的值</param> /// <returns>返回bool值</returns> public static bool GetXmlNodeByArrtibute(XmlNode xn,string attr,string compare) { if (GetAttribute(xn,attr) == compare) { return true; } return false; } /// <summary> /// 獲取XmlElement是否具有指定Attribute值 /// </summary> /// <param name="xn">XmlElement物件</param> /// <param name="attr">Attribute的名稱</param> /// <param name="compare">Attribute的值</param> /// <returns>返回bool值</returns> public static bool GetXmlNodeByArrtibute(XmlElement xe,string compare) { if (GetAttribute(xe,compare) == attr) { return true; } return false; } /// <summary> /// 獲取一個具有指定Attrtibute的XmlNode子節點 /// </summary> /// <param name="xn">XmlNode物件</param> /// <param name="attr">Attrtibute的名稱</param> /// <param name="compare">Attrtibute的值</param> /// <returns>返回相應的子節點</returns> public static XmlNode GetXmlChildNodeByAttrtibute(XmlNode xn,string compare) { foreach (XmlNode cxn in xn.ChildNodes) { if (GetXmlNodeByArrtibute(cxn,attr,compare)) { return cxn; } } return null; } } }
XmlReader.cs

XmlWriter類如下:

技術分享圖片
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;

namespace WpfApp4
{
    public class XmlWriter
    {
        static XmlDocument doc = new XmlDocument();

        /// <summary>
        /// 建立根節點
        /// </summary>
        /// <param name="xn">根節點的名稱</param>
        /// <returns>返回根節點</returns>
        public static XmlElement CreateRootElement(string xn)
        {
            XmlElement xe = doc.CreateElement(xn);
            doc.AppendChild(xe);
            return xe;
        }
        /// <summary>
        /// 新增一個Attribute到一個XmlElement元素
        /// </summary>
        /// <param name="xe">被新增的XmlElement元素</param>
        /// <param name="attrname">Attribute的特證名</param>
        /// <param name="attrtext">Attribute的值</param>
        public static void AppendAttributeToElement(XmlElement xe,string attrname,string attrtext)
        {
            XmlAttribute xa = CreateAttribute(attrname,attrtext);
            xe.Attributes.Append(xa);
        }
        /// <summary>
        /// 新增一個Attribute到一個XmlElement元素
        /// </summary>
        /// <param name="xe">被新增的XmlElement元素</param>
        /// <param name="attr">Attribute物件</param>
        public void AppendAttributeToElement(XmlElement xe,XmlAttribute attr)
        {

            XmlAttribute xa = attr;
            xe.Attributes.Append(xa);
        }
        /// <summary>
        /// 建立一個Attribute物件
        /// </summary>
        /// <param name="attrname">Attribute的特證名</param>
        /// <param name="attrtext">Attribute的值</param>
        /// <returns>返回建立的Attribute物件</returns>
        public static XmlAttribute CreateAttribute(string attrname,string attrtext)
        {
            XmlAttribute xa = doc.CreateAttribute(attrname);
            xa.InnerText = attrtext;
            return xa;
        }
        /// <summary>
        /// 建立一個具有指定名稱和值的節點
        /// </summary>
        /// <param name="name">XmlNode的名稱</param>
        /// <param name="text">XmlNode的值</param>
        /// <returns>返回XmlNode物件</returns>
        public static XmlNode CreateElement(string name,string text)
        {
            XmlNode xn = (XmlNode)doc.CreateElement(name);   //建立具有指定名稱的元素並轉換成節點
            xn.InnerText = text;  //獲取節點中的Text 內容控制元件中的名字
            return xn;
        }
        /// <summary>
        /// 新增新節點到舊節點之後
        /// </summary>
        /// <param name="oldxn">舊節點</param>
        /// <param name="newxn">新節點</param>
        public static void XmlInsertAfter(XmlNode oldxn,XmlNode newxn)
        {
            XmlNode parent = oldxn.ParentNode; //獲取被新增節點的父節點
            parent.InsertAfter(newxn,oldxn); //新增新節點到舊節點之後
        }
        /// <summary>
        /// 新增新節點到舊節點之前
        /// </summary>
        /// <param name="oldxn">舊節點</param>
        /// <param name="newxn">新節點</param>
        public static void XmlInsertBefore(XmlNode oldxn,XmlNode newxn)
        {
            XmlNode parent = oldxn.ParentNode; //獲取被新增節點的父節點
            parent.InsertBefore(newxn,oldxn);//新增新節點到舊節點之前
        }
        /// <summary>
        /// 新增子節點到指定節點中
        /// </summary>
        /// <param name="parentnode">指定的父節點</param>
        /// <param name="childnode">要新增進的子節點</param>
        public static void AppendChild(XmlNode parentnode,XmlNode childnode)
        {
            parentnode.AppendChild(childnode);
        }

        /// <summary>
        /// 建立Xml檔案宣告節點,必須要呼叫此方法
        /// </summary>
        /// <param name="version">版本號,必須為1.0</param>
        /// <param name="encoding">字元編碼</param>
        /// <param name="standalone">獨立特性的值</param>
        public static void CreateXmlDeclaration(string version,string encoding,string standalone)
        {
            XmlDeclaration xd;
            xd = doc.CreateXmlDeclaration(version,encoding,standalone);  //建立宣告節點
            if (doc.ChildNodes == null)  //如果存在根節點
            {
                doc.AppendChild(xd);  //新增根節點
            }
            else
            {
                XmlElement root = doc.DocumentElement;  //獲取文件的根節點
                doc.RemoveAll();  //移除所有節點
                doc.AppendChild(xd);  //新增宣告節點
                doc.AppendChild(root);   ///新增根節點

            }
        }
        /// <summary>
        /// 移除指定的節點
        /// </summary>
        /// <param name="childnode"></param>
        /// <returns>返回移除結果</returns>
        public static bool RemoveChildNode(XmlNode childnode)
        {
            try
            {
                XmlNode parentnode = childnode.ParentNode;  //獲取父節點
                parentnode.RemoveChild(childnode);   //移除父節點下的指定子節點
                return true;
            }
            catch
            {
                return false;
            }

        }
        /// <summary>
        /// 移除所有的節點
        /// </summary>
        /// <param name="xmlnode">節點名稱</param>
        /// <returns></returns>
        public static bool RemoveChildAllNode(XmlNode xmlnode)
        {
            xmlnode.RemoveAll();   //移除所有節點
            if (xmlnode.ChildNodes.Count == 0)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        /// <summary>
        /// 選擇具有指定名稱的一個節點
        /// </summary>
        /// <param name="xn">父節點物件</param>
        /// <param name="xname">要查詢節點的Name</param>
        /// <returns>返回查詢結果</returns>
        public static XmlNode SelectSingleNode(XmlNode xn,string xname)
        {
            return xn.SelectSingleNode(xname);
        }
        /// <summary>
        /// 選擇具有指定名稱的多個節點
        /// </summary>
        /// <param name="xn">父節點物件</param>
        /// <param name="xname">要查詢節點的Name</param>
        /// <returns>返回查詢結果</returns>
        public static XmlNodeList SelectNodes(XmlNode xn,string xname)
        {
            return xn.SelectNodes(xname);
        }
        /// <summary>
        /// 移除節點中指定的Attribute
        /// </summary>
        /// <param name="xn">XmlNode物件</param>
        /// <param name="xan">Attribute的名稱</param>
        /// <returns>返回移除結果</returns>
        public static bool RemoveXmlAttribute(XmlNode xn,string xan)
        {
            int ac = xn.Attributes.Count;
            XmlNode xmlnode = xn.Attributes.RemoveNamedItem(xan);
            if (xmlnode.Attributes.Count == ac - 1)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        /// <summary>
        /// 移除節點中所有的Attribute
        /// </summary>
        /// <param name="xn">XmlNode物件</param>
        /// <returns>返回移除結果</returns>
        public static bool RemoveXmlAttribute(XmlNode xn)
        {
            xn.Attributes.RemoveAll();
            if (xn.Attributes.Count == 0)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        /// <summary>
        /// 替換節點的值
        /// </summary>
        /// <param name="xn">XmlNode物件</param>
        /// <param name="text">新的XmlNode的值</param>
        public static void ReplaceText(XmlNode xn,string text)
        {
            xn.InnerText = text;
        }
        /// <summary>
        /// 替換指定節點
        /// </summary>
        /// <param name="nxn">新節點</param>
        /// <param name="oxn">正在被替換的節點</param>
        /// <returns>返回新節點</returns>
        public static XmlNode ReplaceChild(XmlNode nxn,XmlNode oxn)
        {
            return doc.ReplaceChild(nxn,oxn);
        }
        /// <summary>
        /// 儲存Xml檔案
        /// </summary>
        public static void SavaXml(string url)
        {
            doc.Save(url);
        }
    }
}
XmlWriter.cs

前臺MainWindow有兩個按鍵事件:建立xml(也是寫xml)和讀xml

技術分享圖片
    <StackPanel>
        <Button Content="建立" Click="btnCreatXml"/>
        <Button Content="讀取" Click="btnReadXml"/>
    </StackPanel>
MainWindow.xaml

後臺程式碼如下:

技術分享圖片
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Xml;

namespace WpfApp4
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void AddCountryAttribute(XmlElement root,string country,string capital)
        {
            XmlNode node = XmlWriter.CreateElement("Country"," ");
            XmlWriter.AppendAttributeToElement((XmlElement)node,"名字",country);
            XmlWriter.AppendAttributeToElement((XmlElement)node,"首都",capital);
            XmlWriter.AppendChild(root,node);
        }
        private void btnCreatXml(object sender,RoutedEventArgs e)
        {
            try
            {
                XmlElement root = XmlWriter.CreateRootElement("國家");
                AddCountryAttribute(root,"中國","北京");//增加第一項
                AddCountryAttribute(root,"美國","華盛頓");//增加第二項
                AddCountryAttribute(root,"俄羅斯","莫斯科");//增加第三項
                AddCountryAttribute(root,"日本","東京");//增加第四項
                XmlWriter.CreateXmlDeclaration("1.0","UTF-8",null);
                XmlWriter.SavaXml("xml.xml");//儲存
            }
            catch (Exception exception)
            {
                MessageBox.Show(exception.Message);
            }
        }

        private void btnReadXml(object sender,RoutedEventArgs e)
        {
            try
            {
                XmlReader.LoadXml("xml.xml");
                XmlElement xe = XmlReader.GetXmlDocumentRoot();
                XmlNode xn = XmlReader.ExchangeNodeElement(xe);
                XmlNodeList xnl = xn.ChildNodes;
                XmlElement eCur = (XmlElement)xnl[0];//讀取第一項首都的屬性值
                string str = eCur.GetAttribute("首都");
                MessageBox.Show(str);
            }
            catch (Exception exception)
            {
                MessageBox.Show(exception.Message);
            }
        }
    }
}
MainWindow.xaml.cs

點選建立按鍵會在應用程式目錄中生成一個xml.xml檔案,內容如下

技術分享圖片

點選讀取會彈出一個內容框

技術分享圖片