代码之家  ›  专栏  ›  技术社区  ›  Jichao

建议在C中处理XML配置文件的类。[关闭]

  •  6
  • Jichao  · 技术社区  · 14 年前

    我正在编写一个程序,需要存储一些配置信息。我认为XML是一个不错的选择,但我不想从头开始学习C语言中的XML。

    你能推荐一些处理这个任务的好方法吗?

    4 回复  |  直到 14 年前
        1
  •  7
  •   marc_s    14 年前

    只需使用内置的.NET配置系统!怎么了??

    为此,添加对 System.Configuration 去你的项目,好好看看 ConfigurationManager 该命名空间中的类。

    从Visual Studio 2005开始,还可以在vs-签出内的Visual Designer中定义应用程序或用户范围的设置 Application Settings Overview 在msdn上进行此操作(这些操作适用于WinForms和控制台应用程序)。这些设置存储在 app.config / web.config 对于应用程序范围的设置,并在单独的 user.config 文件位于用户帐户可以访问的用户范围设置目录中。可以在运行时使用标准.NET类(从 系统配置 命名空间)。

        2
  •  1
  •   Ron Savage    14 年前

    虽然我同意“重新发明轮子”不是一个好主意,但是.NET System.Configuration类对于这样一个简单的任务来说是非常困难的。

    我需要为我的一个程序创建单独的配置文件,这些文件可以在命令行上指定(而不只是默认设置为“app.config”),所以我使用了这个简单的类,它将自己保存到一个XML文件中。

    http://www.dot-dash-dot.com/files/UIsettings.vb

        3
  •  0
  •   Jamie    14 年前

    下面是一个简单的小片段,让您开始学习。您不需要知道任何XML…

        internal static string GetConfigSetting(string settingName)
        {
            return ConfigurationManager.AppSettings[settingName].ToString();
        }
    
        internal static bool GetConfigSettingBool(string settingName)
        {
            string setting = GetConfigSetting(settingName);
            if (string.IsNullOrEmpty(setting)) return false;
            bool value = false;
            if (bool.TryParse(setting, out value))
                return value;
            else
                return false;
        }
    
        internal static string[] GetConfigSettingsArray(string settingName)
        {
            return GetConfigSetting(settingName).Split(',');
        }
    
        internal static DateTime? GetConfigSettingDateTime(string settingName)
        {
            string setting = GetConfigSetting(settingName);
            DateTime retval;
            if (DateTime.TryParse(setting, out retval))
            {
                return retval;
            }
            else
            {
                return null;
            }
        }
    
        internal static void SetConfigSetting(string settingName, string value){
            ConfigurationManager.AppSettings[settingName] = value;
        }
    
        4
  •  0
  •   Kevin Nisbet    14 年前

    我使用XML配置类型设置已经有一段时间了,它是由内置配置运行的,有点整洁。基本上,您可以给它一个提示,它将把XML反序列化为一个对象。我想我得到这个的原始资料是 here ,但我不是100%确定,所以如果有人知道作者,请编辑我的回复以给予适当的评价。

    下面是进行反序列化的类:

    using System.Configuration;
    using System.Xml;
    using System.Xml.Serialization;
    using System.Xml.XPath;
    
    namespace Ariel.Configuration
    {
        class XmlSerializerSectionHandler : IConfigurationSectionHandler
        {
            public object Create(object parent, object configContext, XmlNode section)
            {
                XPathNavigator nav = section.CreateNavigator();
                string typename = (string)nav.Evaluate("string(@type)");
                Type t = Type.GetType(typename);
                XmlSerializer ser = new XmlSerializer(t);
                return ser.Deserialize(new XmlNodeReader(section));
            }
        }
    }
    

    现在,您可以创建任何需要配置的类。

    namespace MyProject.Config {
        public class TestConfig {
            /// <summary>
            /// Whether the session is enabled
            /// </summary>
            public bool Enabled { get; set; }
        }
    }
    

    现在,您只需要一个app.config文件。我通常喜欢为每个配置类使用单独的配置文件,因此我将举一个例子。

    <?xml version="1.0"?>
    <configuration>
      <configSections>
        <section name="TestConfig" type="Ariel.Configuration.XmlSerializerSectionHandler, Ariel"/>
      </configSections>
      <runtime>
        <gcServer enabled="true"/>
      </runtime>
    
      <TestConfig configSource="Config\\TestConfig.config" />
    <startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>
    

    重要部分包括: section name=“testconfig”<-配置类 type=ariel.configuration.xmlserializersactionHandler,ariel<-用于反序列化的类型是对象中的XML。这基本上告诉配置管理器要运行什么来创建对象 testconfig configsource=“config\testconfig.config”<-这告诉我们在哪里可以找到testconfig部分的配置文件。

    在您的testconfig.config文件中,您将拥有如下内容:

    <?xml version="1.0" encoding="utf-8" ?>
    <TestConfig type="MyProject.Config.TestConfig, MyProject">
      <Enabled>True</Enabled>
    </TestConfig>
    

    同样重要的是对类名和类型的引用。

    最后但并非最不重要的是,要加载您的配置:

    using System.Configuration;
    Config.SessionKillConfig config = null;
    try {
        config = (Config.SessionKillConfig)ConfigurationManager.GetSection("CdrAnalyzerConfig");
    } catch (System.Configuration.ConfigurationException ex) {
        syslog.Fatal("Loading parser configuration failed", ex);
        return;
    }
    
    if(config.Enabled) { //do stuff }
    

    这可能有点长,但问题是,它很轻便。基本上,要包含配置,您所要做的就是编写一个类,然后编写一个与之匹配的XML文件。

    我不完全确定如何将配置文件作为参数传递给程序,但我认为在configurationManager类的某个地方有一个选项。我甚至认为我在某个地方读到有人正在让它检测文件的更改并将新的配置重新加载到正在运行的程序中,但我没有尝试过类似的方法。不管怎样,我希望这个例子对于您可以采用的一种方法是有用的。