在開發程序中,很多超輕量級不重要數據寫在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", "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); } catch { } } } }
Application.StartupPath,獲取啟動了應用程序的可執行文件的路徑,不包括可執行文件的名稱。可以以程序目錄為生成配置文件的地址。將程序打包安裝到其他環境,我們直接在安裝目錄里就可以找到配置文件了。奧利給!