在开发程序中,很多超轻量级不重要数据写在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,获取启动了应用程序的可执行文件的路径,不包括可执行文件的名称。可以以程序目录为生成配置文件的地址。将程序打包安装到其他环境,我们直接在安装目录里就可以找到配置文件了。奥利给!