1. 程式人生 > WINDOWS開發 >C#之XML操作(XML配置檔案)一起學習一起進步

C#之XML操作(XML配置檔案)一起學習一起進步

在開發程式中,很多超輕量級不重要資料寫在XML裡,比較靈活。

1,XML的讀取。

我們來看一個簡單的XML檔案。

<?xml version="1.0" encoding="UTF-8"?>
<setup>
  <dt enable0="1" enable1="1" enable2="0" />
</setup>

XML 是樹結構的,雖然我的這個例子有點簡單不能完全展示出XML的結構,但並不影響對XML的使用。對XML深入講解的博文有很多,有需要的同學可以在園裡一搜一大把,我也是從很多前輩的博文中一點一點的學習積累的,畢竟學習真正靠的還是自己。在我的例子裡setup是根元素,dt是唯一的子元素,enable0,enable1,enable2是dt的屬性。在xml裡可以用屬性來記錄資訊也可以用元素內容來記錄資訊,根據不同的需求來做出選擇或搭配使用。在我們的例子裡只需用屬性就可以了。 我們用“0”,“1”來記錄winform中chekebox的狀態。

 XmlDocument doc = new XmlDocument();//建立一個XML文件
                XmlReaderSettings settings = new XmlReaderSettings();//設定讀取XML時的屬性。
                settings.IgnoreComments = true;//XML忽略註釋。
          
                XmlReader xmlReader = XmlReader.Create(path,settings);//例項化一個XmlReader物件,解析XML檔案
                doc.Load(xmlReader);//
從指定的 XmlReader 載入 XML 文件。 XmlNode xml = doc.SelectSingleNode("setup");//讀取根元素下的子元素集合 XmlNode node = xml.ChildNodes[0];//取僅有的一個元素 XmlElement element = (XmlElement)node;//為了可以使用屬性儲存資訊,我們把XmlNode轉化為XmlElement。

path 為XML檔案的地址。settings用來設定讀取XML文件時忽略裡邊的註釋。

2,XML 的寫入

XmlDocument document = new XmlDocument();
                document.AppendChild(document.CreateXmlDeclaration("1.0","UTF-8",null));
                XmlElement root = document.CreateElement("setup");
                document.AppendChild(root);
                XmlElement xmldata = document.CreateElement("dt");
                for (int i = 0; i < intlist.Count; i++)
                {
                    xmldata.SetAttribute("enable" + i,intlist[i].ToString());
                }

                root.AppendChild(xmldata);

                document.Save(path);

document.CreateXmlDeclaration("1.0","UTF-8",null)建立XML宣告。它定義 XML 的版本(1.0)和所使用的編碼(UTF-8 : 萬國碼,可顯示各種語言)。使用AppendChild將建立的元素加入到XML文件中, 用XmlElement的SetAttribute建立屬性。這裡有點類似於NJ.Linq裡建立 JSON物件。最後儲存即可。

3,程式配置

我們先建立一個Form窗體Setup(我用的原生態控制元件)。

技術分享圖片

using System;
using System.Collections.Generic;
using System.Windows.Forms;


namespace CredentialGenerator
{
    public partial class Setup : Form
    {
        Setupclass setupclass = new Setupclass();
        MainForm mainform;
        public MainForm mainForm { get => mainform; set => mainform = value; }
        List<bool> ConditionsList = new List<bool>();
        public Setup()
        {
            InitializeComponent();
           
            Setupclass setupclass = new Setupclass();
                if (setupclass.InitializeSetup("enable0") == 0)
                {
                    enablefalse.Checked = true;
                }
                else
                {
                    enabletrue.Checked = true;
                }


                if (setupclass.InitializeSetup("enable1") == 0)
                {
                    conditionsfalse.Checked = true;
                }
                else
                {

                    conditionstrue.Checked = true;
                }


                if (setupclass.InitializeSetup("enable2") == 0)
                {
                    dateradiofalse.Checked = true;
                }
                else
                {

                    dateradiotrue.Checked = true;
                }


            if (setupclass.InitializeSetup("enable3") == 0)
            {
                LogcheckBox.Checked = false;
            }
            else
            {

                LogcheckBox.Checked = true;
            }

            if (setupclass.InitializeSetup("enable4") == 0)
            {
                Emptytablefals.Checked = true;
            }
            else
            {

                Emptytabletrue.Checked = true;
            }
            use.Enabled = false;

        }
       


        private void savebutton_Click(object sender,EventArgs e)
        {
            Close();            
        }
       
      
        private void use_Click(object sender,EventArgs e)
        {
            ConditionsList.Add(enabletrue.Checked);
            ConditionsList.Add(conditionstrue.Checked);
            ConditionsList.Add(dateradiotrue.Checked);            
            ConditionsList.Add(LogcheckBox.Checked);
            ConditionsList.Add(Emptytabletrue.Checked);
            setupclass.Save(ConditionsList);           
            mainForm.bh();
            if (Emptytabletrue.Checked)
            {
                mainForm.SetEmptytable();
            }
            else
            {
                mainForm.Setnulltable();
            }
            ConditionsList.Clear();
            use.Enabled = false;


        }

        public void change()
        {
            use.Enabled = true;
            int enable ;
            int conditions ;
            int dateradio ;
            int log;
            int nulltable;
            if (enablefalse.Checked)
            {
                enable = 0;
            }
            else
            {
                enable = 1;
            }
            if (conditionsfalse.Checked)
            {
                conditions = 0;
            }
            else
            {
                conditions = 1;
            }
            if (dateradiofalse.Checked)
            {
                dateradio = 0;
            }
            else
            {
                dateradio = 1;
            }
            if (LogcheckBox.Checked)
            {
                log = 0;
            }
            else
            {
                log = 1;
            }

            if (Emptytablefals.Checked)
            {
                nulltable = 0;
            }
            else
            {
                nulltable = 1;
            }
            if (enable.Equals( setupclass.InitializeSetup("enable0")) && conditions.Equals(setupclass.InitializeSetup("enable1")) 
                && dateradio.Equals(setupclass.InitializeSetup("enable2")) && !log.Equals(setupclass.InitializeSetup("enable3"))
                &&nulltable.Equals(setupclass.InitializeSetup("enable4")))
            {
                use.Enabled = false;
            }
            
            

        }

      

   
        private void radio_CheckedChanged(object sender,EventArgs e)
        {
            change();
        }
        private void LogcheckBox_CheckedChanged(object sender,EventArgs e)
        {
           
            change();
        }
    }
   
         
    
         
    

}

在Winform的程式碼裡我還做了一些處理,每次改變RadioButton的屬性,都會隨時監測XML,只有當至少有一個RadioButton的屬性發生變化時,“應用”按鈕才能點選。

接下來就是把上面XML的讀取和寫入整合到一個類裡。

using System.Collections.Generic;
using System.Windows.Forms;
using System.Xml;
using static System.Convert;

namespace CredentialGenerator
{
    public  class Setupclass
    {
        
        string path = Application.StartupPath + @"\setupconfig.xml";
        public  int InitializeSetup(string enble)
        {
           
            int InitializeEnable = 0;
         
                XmlDocument doc = new XmlDocument();//建立一個XML文件
                XmlReaderSettings settings = new XmlReaderSettings();//設定讀取XML時的屬性。
                settings.IgnoreComments = true;//XML忽略註釋。
            try
            {
                XmlReader xmlReader = XmlReader.Create(path,settings);//例項化一個XmlReader物件,解析XML檔案
                doc.Load(xmlReader);//從指定的 XmlReader 載入 XML 文件。
                XmlNode xml = doc.SelectSingleNode("setup");//讀取根元素下的子元素集合
                XmlNode node = xml.ChildNodes[0];//取僅有的一個元素
                XmlElement element = (XmlElement)node;//為了可以使用屬性儲存資訊,我們把XmlNode轉化為XmlElement。

                InitializeEnable =(ToInt32(element.GetAttribute(enble).ToString()));
                xmlReader.Close();
            }
            catch 
            {
              
            }
           

            return InitializeEnable;

        }

        
        public void Save(List<bool> boollist)
        {
            List<int> intlist = new List<int>();
            
            foreach (var item in boollist)
            {
                if (item)
                {
                    intlist.Add(1);
                }
                else
                {
                    intlist.Add(0);
                }
            }

            try
            {
                XmlDocument document = new XmlDocument();
                document.AppendChild(document.CreateXmlDeclaration("1.0",intlist[i].ToString());
                }

                root.AppendChild(xmldata);

                document.Save(path);
            }
            catch
            {

            }
        }
    }
}

Application.StartupPath,獲取啟動了應用程式的可執行檔案的路徑,不包括可執行檔案的名稱。可以以程式目錄為生成配置檔案的地址。將程式打包安裝到其他環境,我們直接在安裝目錄裡就可以找到配置檔案了。奧利給!