You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用ConfigurationBuilder无法解析XML配置文件中的值

使用Microsoft.Extensions.Configuration加载XML配置返回null的问题

我尝试用Microsoft.Extensions.Configuration下的IConfiguration/ConfigurationBuilder从XML配置文件加载配置值,但每次获取值都返回null。

XML配置文件内容

<Application>
    <Configuration>
        <Modules>
            <SampleModule>
                <Detection>
                    <ScaleFactor>1.3</ScaleFactor>
                    <MinNeighbors>1</MinNeighbors>
                    <MinSize></MinSize>
                    <MaxSize></MaxSize>
                </Detection>
                <Overlay>
                    <Draw>true</Draw>
                    <Text>Face</Text>
                    <TextColor>
                        <A>0</A>
                        <R>255</R>
                        <G>0</G>
                        <B>0</B>
                    </TextColor>
                    <BoxColor>
                        <A>0</A>
                        <R>255</R>
                        <G>0</G>
                        <B>0</B>
                    </BoxColor>
                    <BoxBorderSize>1.5</BoxBorderSize>
                </Overlay>
                <UseEvents>true</UseEvents>
            </SampleModule>
        </Modules>
    </Configuration>
</Application>

调试用的NUnit测试代码

[Test]
public void TestConfigurationParsing() {

    ConfigurationBuilder builder = new();
    
    String configPath = Path.Join(Directory.GetCurrentDirectory(), "Configuration", "EyeDetection.xml");
    String xmlPath = "Application:Configuration:Modules:SampleModule:Overlay:Text";
    // /Application/Configuration/Modules/SampleModule/Overlay/Text
    
    if (!File.Exists(configPath)) {
        throw new FileNotFoundException($"Could not find {configPath}");
    }

    builder.AddXmlFile(configPath);

    IConfigurationRoot config = builder.Build();
    
    Assert.IsNotNull(config[xmlPath]);
    Assert.That(config[xmlPath], Is.EqualTo("Face"));
    // Assert.IsNotNull(config.GetValue<String>(xmlPath));
    // Assert.That(config.GetValue<String>(xmlPath), Is.EqualTo("Face"));
}

测试失败,不管值的类型(布尔、整数、字符串等),返回的都是null。

路径说明:

  • 应用程序根目录为当前目录(.)
  • 配置文件放在./Configuration/*.xml路径下

请问我哪里操作错了?实在找不到问题所在……


问题原因及解决办法

问题出在XML配置的根节点处理上:Microsoft.Extensions.Configuration.Xml在加载XML文件时,默认会忽略根节点,直接从根节点的子节点开始构建配置路径。

你的配置根节点是<Application>,所以实际的配置路径应该去掉开头的Application:,改成:

String xmlPath = "Configuration:Modules:SampleModule:Overlay:Text";

另外还有几个需要注意的细节:

  • 确保XML文件复制属性正确:在项目中选中EyeDetection.xml,右键设置复制到输出目录为“如果较新则复制”或“始终复制”,避免测试运行时输出目录缺少配置文件。
  • 空节点处理:<MinSize>和<MaxSize>这类空节点,加载后会返回空字符串而非null,后续取值时需注意区分。
  • 复杂类型绑定:如果要将配置映射到实体类,可使用config.GetSection("Configuration:Modules:SampleModule").Get<SampleModuleConfig>(),避免手动拼接路径出错。

修改后的测试代码:

[Test]
public void TestConfigurationParsing() {

    ConfigurationBuilder builder = new();
    
    String configPath = Path.Join(Directory.GetCurrentDirectory(), "Configuration", "EyeDetection.xml");
    // 去掉开头的Application:
    String xmlPath = "Configuration:Modules:SampleModule:Overlay:Text";
    
    if (!File.Exists(configPath)) {
        throw new FileNotFoundException($"Could not find {configPath}");
    }

    builder.AddXmlFile(configPath);

    IConfigurationRoot config = builder.Build();
    
    Assert.IsNotNull(config[xmlPath]);
    Assert.That(config[xmlPath], Is.EqualTo("Face"));
}

修改后测试即可正常通过,正确获取到配置值。


内容的提问来源于stack exchange,提问作者Oliver Karger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 13:17:02