C#中XDocument.Descendants始终返回空结果,求助排查原因
搞定你的XML节点查询问题
嘿,我一眼就瞅出问题所在了——你的XML文件带了默认命名空间,而你用LINQ to XML查询的时候没考虑到这一点,所以才查不到节点!
先给你还原下你的XML核心结构(从你提供的内容里提取的关键部分):
<?xml version="1.0" encoding="utf-8"?> <SETS xmlns="http://tempuri.org/SETS.xsd"> <PALETTE> <COLOR>...</COLOR> </PALETTE> </SETS>
为啥查不到?
XML里的xmlns="http://tempuri.org/SETS.xsd"就是默认命名空间,它相当于给所有节点加了个“隐形前缀”。LINQ to XML在查询时,直接写"SETS"这种纯字符串,只会找没有命名空间的节点,自然匹配不上带命名空间的那些元素。
修复后的代码
你只需要先声明这个命名空间,然后把它和节点名称拼在一起查询就行,修改后的代码如下:
using System; using System.Linq; using System.Xml.Linq; namespace XML_TESTER_CM { internal class Program { private static void Main(string[] args) { XDocument xDoc; xDoc = XDocument.Load("Palette_Sets.xml"); // 声明XML的默认命名空间 XNamespace ns = "http://tempuri.org/SETS.xsd"; // 用命名空间+节点名称的方式查询 var result1 = xDoc.Descendants(ns + "SETS"); var result2 = xDoc.Descendants(ns + "PALETTE"); var result3 = xDoc.Descendants(ns + "COLOR"); // 加几行输出验证一下是否查到了节点 Console.WriteLine($"SETS节点数量: {result1.Count()}"); Console.WriteLine($"PALETTE节点数量: {result2.Count()}"); Console.WriteLine($"COLOR节点数量: {result3.Count()}"); } } }
额外小技巧
- 如果你不想硬编码命名空间字符串,可以用根节点自动获取:
XNamespace ns = xDoc.Root.GetDefaultNamespace(); - 别忘了检查XML文件的路径!控制台项目默认会从输出目录(比如
bin/Debug/net6.0)加载文件,你可以右键XML文件→属性→设置“复制到输出目录”为“始终复制”,这样就不会出现文件找不到的问题啦。
内容的提问来源于stack exchange,提问作者Relok
相关产品推荐
相关产品推荐

