.NET配置文件:如何检查ConfigSection是否存在

时间:2014-05-02 14:47:20

标签: c# .net

考虑:

该行:

<section name="unity" />

块:

<unity>
    <typeAliases />
    <containers />
</unity>

在缺少块时,假设该行在 .config 文件中可用。

如何以编程方式检查块是否存在?

[编辑]

对于那些天才的人,他们很快就将问题标记为否定:

我已经尝试了ConfigurationManager.GetSection()

var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

var section = config.GetSection("unity");

var sInfo = section.SectionInformation;

var isDeclared = sInfo.IsDeclared;

如果我弄错了,请纠正我,如果定义了<configSections>,上面会返回 null (即使实际的统一块是丢失)。

8 个答案:

答案 0 :(得分:14)

我在搜索这篇文章的答案时发现了这篇文章。我想我会回来并发布答案,因为我已经解决了它。

由于ConfigurationSection继承自ConfigurationElement,因此您可以使用ElementInformation来判断在反序列化后是否找到了实际元素。

使用此方法检测配置文件中是否缺少ConfigurationSection元素。 ConfigurationSection中的以下方法来自它对ConfigurationElement的继承:

//After Deserialization
if(!customSection.ElementInformation.IsPresent)
    Console.WriteLine("Section Missing");

要确定某个元素是否缺失,您可以使用该部分中的属性(让我们假装它被称为&#39; PropName&#39;),获取PropName的ElementInformation属性并检查IsPresent标志:

if(!customSection.propName.ElementInformation.IsPresent)
    Console.WriteLine("Configuration Element was not found.");

当然,如果你想检查&lt; configSections&gt;如果缺少定义,请使用以下方法:

CustomSection mySection = 
    config.GetSection("MySection") as CustomSection;

if(mySection == null)
    Console.WriteLine("ConfigSection 'MySection' was not defined.");

- 希望这有帮助

答案 1 :(得分:2)

使用ConfigurationManager.GetSection。如果该部分不存在,这将返回null

  

返回值

     

类型:System.Object

     

指定的ConfigurationSection对象,如果该部分不存在,则返回null。

if (ConfigurationManager.GetSection("unity") == null)
{
    Console.WriteLine("Section does not exist");
}

答案 2 :(得分:2)

以下是我解决这个问题的方法。

<?xml version="1.0" encoding="utf-8" ?>
<d:PercentComplete m:type="Edm.Int32">30</d:PercentComplete>

第一次检查是定义,第二次是块

答案 3 :(得分:0)

与其他人类似,我认为您需要使用ConfigurationManager.GetSection()。但是,如果我正确地阅读了您的问题,您是否要求检查部分名称中是否存在统一性=&#34; Unity&#34;?如果是这样,您将需要执行以下操作:

ConfigurationManager.GetSection("unity/unity");

然后,您可以根据需要检查cs或执行类似于RB建议的操作。

<强> *** *** EDIT

好的,这个怎么样,它有点长啰嗦但可能会有效:

ConfigurationSection section = ConfigurationManager.GetSection("unity");
System.Xml.XmlDocument xmlData = new System.Xml.XmlDocument();
xmlData.LoadXml(section);

XmlNode Found = null;

foreach (System.Xml.XmlNode node in xmlData.ChildNodes)         
{             
    if (node.HasChildNodes) 
    {        
        Found = FindNode(node.ChildNodes, "unity"); 
    }          
}

if(Found == null) //do something   

答案 4 :(得分:0)

您可以使用xml阅读器打开配置文件,然后导航到名为&#34; unity&#34;或者您可以实现IConfigurationSectionHandler,在CreateMethod内,您可以区分传入节点,并检查它是否为行或块

  public class CustomConfigurationSectionHandler : IConfigurationSectionHandler { 
     public object Create(object parent, 
       object configContext, System.Xml.XmlNode section)
           {
                 //check if section is a line , if yes return null
                 if( section ...)
                 { return null; }
                 //otherwise return whatever result you want :)
                 else {  }
           }
   }

当然,处理程序需要在配置文件中注册,以便在您调用ConfigurationManager.GetSection("unity")时它将被解析。

答案 5 :(得分:0)

我试图避免基于XML的解决方案。但似乎是实现这一目标的唯一途径。

列出以下解决方案以供将来参考。

[@ sr28和@tchrikch提出了同样的建议]

if (XDocument
  .Load(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile)
  .XPathSelectElement("/*[local-name() = 'configuration']/*[local-name() = 'unity']") == null)

答案 6 :(得分:-1)

我相信你可以使用ConfigurationManager.GetSection Method

if(ConfigurationManager.GetSection(sectionName) == null)
{
  // do something
}

答案 7 :(得分:-1)

您可以打开配置文件并尝试按名称访问配置。

CustomSection customSection;

            // Get the current configuration file.
            System.Configuration.Configuration config =
                    ConfigurationManager.OpenExeConfiguration(
                    ConfigurationUserLevel.None);

            // Create the section entry   
            // in the <configSections> and the  
            // related target section in <configuration>. 
            if (config.Sections["CustomSection"] == null)
            {

enter link description here