XmlDocument最轻量可控,但需处理命名空间;ConfigurationManager适用于标准配置文件但.NET Core+需改用ConfigurationBuilder;XDocument更现代但需注意命名空间和导航路径;手动解析须验证文件存在、编码、转义等细节。

用 XmlDocument 读取配置节点最直接
如果 XML 文件结构简单,比如只有 和若干 子节点,XmlDocument 是最轻量、最可控的选择。它不依赖 .NET 配置系统,也不强制要求文件名或路径格式。
常见错误是直接用 SelectSingleNode("connectionStrings") 却没处理命名空间或根路径问题——XML 若带默认命名空间(如 xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0"),必须注册 XmlNamespaceManager,否则查不到节点。
- 先检查 XML 是否有命名空间;没有就跳过命名空间注册步骤
- 用
GetElementsByTagName("add")比逐层SelectSingleNode更容错 -
connectionString属性名大小写敏感,实际是connectionString(不是connectionstring或ConnectionString)
用 ConfigurationManager 读取标准配置文件
当 XML 是标准的 App.config 或 Web.config,且项目已引用 System.Configuration,优先走 ConfigurationManager。它自动处理节映射、加密、重定向等,但只认固定文件名和位置。
容易踩的坑:在 .NET Core / .NET 5+ 项目中直接引用 System.Configuration 会编译通过,但运行时抛 System.Configuration.ConfigurationErrorsException —— 因为新版本默认不启用旧配置系统。
- .NET Framework 项目:确保
App.config已设为“复制到输出目录” - .NET Core / .NET 5+:改用
ConfigurationBuilder+AddXmlFile(),并安装Microsoft.Extensions.Configuration.Xml包 - 连接字符串节名必须严格为
connectionStrings,拼错或加空格都会返回null
XDocument + LINQ 查询更现代、更函数式
XDocument 是 LINQ to XML 的核心类型,适合需要链式查询、条件过滤或转换多个连接字符串的场景。比 XmlDocument 更简洁,但对初学者来说 XPath 表达式容易写错。
典型错误是用 .Element("add") 试图直接获取子元素,却忽略了 是父容器,且 是它的直接子元素——必须先定位到根下的 connectionStrings 节点再查 add。
- 用
doc.Root?.Element("connectionStrings")?.Elements("add")安全导航 - 属性值用
element.Attribute("connectionString")?.Value,避免空引用异常 - 若 XML 有命名空间,需用
XNamespace前缀,例如ns + "add"
var doc = XDocument.Load("app.config");
XNamespace ns = "http://schemas.microsoft.com/.NetConfiguration/v2.0";
var connectionString = doc.Root
?.Element(ns + "connectionStrings")
?.Elements(ns + "add")
?.FirstOrDefault(x => x.Attribute("name")?.Value == "DefaultConnection")
?.Attribute("connectionString")?.Value;
手动解析时注意路径、编码与异常边界
无论用哪种方式,文件路径错误或编码不匹配(如 UTF-8 with BOM 被当 ANSI 读)都会导致解析失败,报错信息往往模糊,比如 XmlException: Root element is missing,其实只是文件根本没读到内容。
真实项目里常忽略的点:XML 文件被其他进程独占(如 Visual Studio 正在编辑)、部署后路径相对于 AppDomain.CurrentDomain.BaseDirectory 而非 exe 目录、连接字符串含特殊字符(如 &)未转义导致 XML 解析中断。
- 用
File.Exists(path)和File.ReadAllText(path, Encoding.UTF8)先验证可读性 - 连接字符串中的
&必须写成&,否则 XML 加载失败 - 不要硬编码路径,用
Path.Combine(AppContext.BaseDirectory, "config.xml")










