根元素必须与引用该文件的节的名称匹配

时间:2010-12-29 17:01:18

标签: c#

我正在使用AppSettings的“文件”属性,但我收到此错误

  

根元素必须与名称匹配   引用该文件的部分,   '的appSettings'

我在Windows项目中添加了ClassLibrary1.dll和ClassLibrary1.dll.config。 Ny windows应用程序有自己的app.config

<configuration>
 <appSettings file="ClassLibrary1.dll.config"> 
    <add key="main" value="main"/>
  </appSettings>
</configuration>

提前谢谢

6 个答案:

答案 0 :(得分:8)

您的外部文件必须如下所示:

<?xml version="1.0"?>
<appSettings>
  <add key="main" value="main"/>
</appSettings>

与使用configSource时不同,使用file属性时不能有配置节点。我甚至不能100%确定你可以使用具有configSource属性的配置节点,我总是匹配正在外化的根节点。有关详细信息,请参阅MSDN文档:http://msdn.microsoft.com/en-us/library/ms228154.aspx

此外,我从未试图像您一样参考汇编配置文件。我想知道这可能会导致问题吗?尝试仅将appSettings节点提取到另一个配置文件,看看是否能解决问题。

编辑:这个外部文件(我们称之为appSettings_external.config)可以通过两种方式使用:

app.config :(设置已合并)

   <?xml version="1.0"?>
   <configuration>
    <appSettings file="appSettings_external.config">
      <add key="main" value="main"/>
    </appSettings>
   </configuration>

app.config :(仅从外部配置中提取设置)

   <?xml version="1.0"?>
   <configuration>
    <appSettings configSource="appSettings_external.config" />
   </configuration>

答案 1 :(得分:2)

确保文件“ClassLibrary1.dll.config”中的根XML元素为“appSettings”。

http://weblogs.asp.net/pwilson/archive/2003/04/09/5261.aspx

答案 2 :(得分:2)

以下是基于OP最近评论的后续答案:如果我有多个外部配置文件怎么办?

我的建议是修改配置设置的设计。我假设您有多个类库,并且每个类库都有自己的一组设置,这些设置当前存储在appSettings部分中。在这种情况下,您的配置文件可能如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <!-- App Settings for Class Library 1 -->
    <add key="ClassLibrary1Value1" value="123"/>
    <add key="ClassLibrary1Value2" value="234"/>
    <add key="ClassLibrary1Value3" value="345"/>
    <!-- App Settings for Class Library 2 -->
    <add key="ClassLibrary2Value1" value="ABC"/>
    <add key="ClassLibrary2Value2" value="BCD"/>
    <add key="ClassLibrary2Value3" value="CDE"/>
  </appSettings>
</configuration>

您访问这些设置的代码可能如下所示:

        var appSettings = System.Configuration.ConfigurationManager.AppSettings;
        Console.WriteLine(appSettings["ClassLibrary1Value1"]);
        Console.WriteLine(appSettings["ClassLibrary1Value2"]);
        Console.WriteLine(appSettings["ClassLibrary1Value3"]);

        Console.WriteLine(appSettings["ClassLibrary2Value1"]);
        Console.WriteLine(appSettings["ClassLibrary2Value2"]);
        Console.WriteLine(appSettings["ClassLibrary2Value3"]);

相反,我建议你尝试将每个类库的设置分成它自己的配置部分。您可以通过修改可执行文件的配置文件来完成此操作:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="classLibrary1" type="System.Configuration.AppSettingsSection"/>
    <section name="classLibrary2" type="System.Configuration.AppSettingsSection"/>
  </configSections>
  <classLibrary1 configSource="ClassLibrary1.dll.config" />
  <classLibrary2 configSource="ClassLibrary2.dll.config" />
</configuration>

您的ClassLibrary1.dll.config文件如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<classLibrary1>
  <add key="Value1" value="123"/>
  <add key="Value2" value="234"/>
  <add key="Value3" value="345"/>
</classLibrary1>

您的ClassLibrary2.dll.config文件如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<classLibrary2>
  <add key="Value1" value="ABC"/>
  <add key="Value2" value="BCD"/>
  <add key="Value3" value="CDE"/>
</classLibrary2>

您访问这些设置的代码如下所示:

        var classLibrary1AppSettings = (System.Collections.Specialized.NameValueCollection)System.Configuration.ConfigurationManager.GetSection("classLibrary1");
        Console.WriteLine(classLibrary1AppSettings["Value1"]);
        Console.WriteLine(classLibrary1AppSettings["Value2"]);
        Console.WriteLine(classLibrary1AppSettings["Value3"]);

        var classLibrary2AppSettings = (System.Collections.Specialized.NameValueCollection)System.Configuration.ConfigurationManager.GetSection("classLibrary2");
        Console.WriteLine(classLibrary2AppSettings["Value1"]);
        Console.WriteLine(classLibrary2AppSettings["Value2"]);
        Console.WriteLine(classLibrary2AppSettings["Value3"]);

答案 3 :(得分:0)

结束标记的/字符似乎丢失了:

<configuration>
    <appSettings file="ClassLibrary1.dll.config"> 
        <add key="main" value="main" />
    </appSettings>
</configuration>

答案 4 :(得分:0)

查看Google键入的第一个结果“根元素必须与引用文件的部分名称相匹配”

http://weblogs.asp.net/pwilson/archive/2003/04/09/5261.aspx

然后在页面

中查找“根元素必须与引用文件的节的名称相匹配”

答案 5 :(得分:0)

除了确保外部配置文件确实满足错误消息中指定的要求(即xml的根元素应该是appSettings)之外,您还可以检查VS是否未读取旧版本。当您修改外部配置文件时,不会触发重新编译,因此对于每次更改,您还应修改主web.config 以便刷新(或至少触摸它)。