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

使用LINQ从带属性XML元素提取子元素值遇问题求助

问题分析与解决方案

你遇到的问题很明确:你的代码只提取了第一个<Subcat>元素的值,因为你用了e.Element("Subcat")——这个方法只会返回匹配名称的第一个子元素,而你的<Cat id="Scales">下面有多个<Subcat>节点,自然就漏掉了后面的内容。

修正后的代码

我们只需要把获取子元素的方法从Element()改成Elements(),然后遍历所有返回的<Subcat>节点即可:

public static List<string> GetScalesComboBox() 
{
    XElement xelement = XElement.Load("data/static/Categories.xml");
    var querylist = new List<String>();
    
    // 找到id为Scales的Cat元素
    var targetCat = xelement.Elements("Cat")
                           .FirstOrDefault(a => (string)a.Attribute("id") == "Scales");
    
    if (targetCat != null)
    {
        // 遍历所有Subcat子元素,添加它们的值到列表
        foreach (XElement subcat in targetCat.Elements("Subcat"))
        {
            querylist.Add(subcat.Value);
        }
    }
    
    return querylist;
}

更简洁的LINQ写法

如果你想让代码更紧凑,可以直接用LINQ一次性生成列表,省去手动的foreach:

public static List<string> GetScalesComboBox() 
{
    XElement xelement = XElement.Load("data/static/Categories.xml");
    
    return xelement.Elements("Cat")
                   .Where(a => (string)a.Attribute("id") == "Scales")
                   .SelectMany(cat => cat.Elements("Subcat")) // 展开所有Subcat节点
                   .Select(subcat => subcat.Value)
                   .ToList();
}

关于ComboBox的填充代码

你的ComboBox填充逻辑本身没有问题,当GetScalesComboBox()返回完整的子类别列表后,它会把所有项都添加到下拉框中,正常显示所有内容。

内容的提问来源于stack exchange,提问作者Dylan Benton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:58:38