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

  • 相关阅读:
    主流的Nosql数据库的对比
    CCF考试真题题解
    排序
    2017-10-03-afternoon
    POJ——T 2728 Desert King
    51Nod——T 1686 第K大区间
    POJ——T 2976 Dropping tests
    2017-10-02-afternoon
    入参是小数的String,返回小数乘以100的String
    银联支付踩过的坑
  • 原文地址:https://www.cnblogs.com/yuanshuo/p/12800727.html
Copyright © 2011-2022 走看看