使用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
相关产品推荐
相关产品推荐

