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