zoukankan      html  css  js  c++  java
  • 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", "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,获取启动了应用程序的可执行文件的路径,不包括可执行文件的名称。可以以程序目录为生成配置文件的地址。将程序打包安装到其他环境,我们直接在安装目录里就可以找到配置文件了。奥利给!

  • 相关阅读:
    动态传参
    函数的介绍
    文件的操作
    send email with formatted table
    minimize and close window with customed winform
    python algorithm
    something important about docker
    book list
    which language is suitable for what to do
    Find Duplicate Items in list fast
  • 原文地址:https://www.cnblogs.com/yuanshuo/p/12800727.html
Copyright © 2011-2022 走看看