C# 使用LINQ从属性化元素返回xml子元素

C# 使用LINQ从属性化元素返回xml子元素,c#,xml,linq,C#,Xml,Linq,我得到了下面的XML,我试图根据父类的属性提取子类别的值,并将它们放在一个组合框中 XML 问题是,在我运行下面的代码之后,它只返回第一个元素值(在本例中是Major)。我有什么明显的遗漏吗 班级 public static List<string> GetScalesComboBox() { XElement xelement = XElement.Load("data/static/Categories.xml");

我得到了下面的XML,我试图根据父类的属性提取子类别的值,并将它们放在一个组合框中

XML

问题是,在我运行下面的代码之后,它只返回第一个元素值(在本例中是Major)。我有什么明显的遗漏吗

班级

public static List<string> GetScalesComboBox()
        {
            XElement xelement = XElement.Load("data/static/Categories.xml");
            var querylist = new List<String>();
            var Subcat = from a in xelement.Elements("Cat")
                         where (string)a.Attribute("id") == "Scales"
                         select a;

            foreach (XElement e in Subcat)
            {
                string Cate = e.Element("Subcat").Value;
                querylist.Add(Cate);
            }
            return querylist;
        }
public静态列表GetScalesComboBox()
{
XElement=XElement.Load(“data/static/Categories.xml”);
var querylist=新列表();
var Subcat=来自元素中的元素(“Cat”)
其中(字符串)a.Attribute(“id”)=“Scales”
选择一个;
foreach(子集合中的元素e)
{
字符串Cate=e.Element(“Subcat”).值;
添加查询列表(Cate);
}
返回查询列表;
}
然后用它进入组合框

List<String> ScaleComboList = XMLUtility.GetScalesComboBox();
            for (int i = 0; i < ScaleComboList.Count; i++)
            {
                CMB_SubCategory.AddItem(ScaleComboList[i]);
            }
            CMB_SubCategory.selectedIndex = 0;
            CMB_SubCategory.Enabled = true;
List ScaleComboList=xmlputility.GetScalesComboBox();
for(int i=0;i

任何帮助都会很好。谢谢。

在您的
foreach
循环中,在
字符串Cate=e.Element(“Subcat”).Value行中,您只选择了第一个元素。您可以尝试将循环的头更改为
(Subcat.Elements()中的元素e)
,它将遍历所有子元素。 之后,将循环体更改为
querylist.Add(e.Value)

完整代码:

foreach (XElement e in Subcat.Elements())
    querylist.Add(e.Value);

我永远都不明白为什么人们要费劲地抓取屏幕,而不是复制和粘贴代码。首先
Subcat
实际上是“Cat”元素的集合,所以这不是一个好名字。然后使用
Element(“Subcat”)
而不是
Elements(“Subcat”)
,这意味着您只得到给定“Cat”中的第一个“Subcat”,而不是全部。