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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 02:23:00