C# 基于组合框选定项的特定xml子项

C# 基于组合框选定项的特定xml子项,c#,xml,children,C#,Xml,Children,这可能是重复的,但我还没有找到解决方案 我有一个从xml文件填充的组合框。当我在组合框中选择一个项目时,我想用同一个xml文件中的“特殊”元素填充一个列表框 xml: 野蛮人 NG CG NN CN NE CE 快速移动 愤怒的力量 我可以让列表框填充所有的“特殊”元素,但我只需要指定类名的元素(即Barbarian属性) 使用所有“特殊”元素填充列表框的代码,无论选择了哪个组合框项目: //Gets Specials from xml public static List<strin

这可能是重复的,但我还没有找到解决方案

我有一个从xml文件填充的组合框。当我在组合框中选择一个项目时,我想用同一个xml文件中的“特殊”元素填充一个列表框

xml:


野蛮人
NG CG NN CN NE CE
快速移动
愤怒的力量
我可以让列表框填充所有的“特殊”元素,但我只需要指定类名的元素(即Barbarian属性)

使用所有“特殊”元素填充列表框的代码,无论选择了哪个组合框项目:

//Gets Specials from xml
public static List<string> GetSpecialsFromXml(string filename, string tagname)
{
    List<string> Specials = new List<string>();
    XmlDocument doc = new XmlDocument();
    
    doc.Load(filename);
   
    XmlNodeList specials = doc.GetElementsByTagName(tagname);

    foreach(XmlNode special in specials)
    {
        Specials.Add(special.InnerText);
    }
    return Specials;
}

//Loads feats into feat list
public void LoadFeats()
{
    List<string> Special = GetSpecialsFromXml(Gamepath, "Special");
    FeatBox.Items.AddRange(Special.ToArray());
}
//从xml获取特殊信息
公共静态列表GetSpecialsFromXml(字符串文件名、字符串标记名)
{
列表特殊项=新列表();
XmlDocument doc=新的XmlDocument();
doc.Load(文件名);
XmlNodeList specials=doc.GetElementsByTagName(标记名);
foreach(XmlNode专用于特价)
{
Specials.Add(special.InnerText);
}
退货特价;
}
//将专长加载到专长列表中
公共void LoadFeats()
{
List Special=GetSpecialsFromXml(游戏路径,“特殊”);
FeatBox.Items.AddRange(Special.ToArray());
}
使用组合框SelectedItemChanged事件调用LoadFeats

在处理xml文件时,我仍然是个笨蛋

编辑:TL;灾难恢复解决方案:

公共静态列表GetSpecialsFromXml(字符串文件名,字符串标记名)
更改为
公共列表GetSpecialsFromXml(字符串文件名,字符串标记名)

添加了
stringcombo=ComboBox.Text和字符串strXPath=$“ClassID[{Combo}='{Combo}']/Special”

替换的
XmlNodeList specials=doc.GetElementsByTagName(标记名)
使用
XmlNodeList specials=doc.SelectNodes(strXPath)

在SelectNodes()函数调用中使用XPath,而不是使用doc.GetElemnetByTagName查找“标记名”。XPath对于XML就像SQL对于数据库一样强大

使用类似于“SelectNodes()”调用中的XPath语句

替换XmlNodeList specials=doc.GetElementsByTagName(标记名);用这个

XmlNodeList specials = doc.SelectNodes( strXPath );
然后像已经在做的那样迭代


祝你的项目好运

看起来很有希望。但是,我需要将strXpath设置为ComboBox.SelectedItem,对吗?到目前为止,当我尝试使用它时,它给出了一个“对象引用”错误。ClassID似乎使用了一个参数,对吗?如何将参数设置为ComboBox.SelectedItem?特别是如果它给出了一个对象引用错误?谢谢我必须从
公共静态列表GetSpecialsFromXml(字符串文件名,字符串标记名)
中删除“static”,现在我可以引用组合框了。现在,为了将该值输入到“strXpath”中,我们可以使用
stringcombo=ComboBox.Text
$“ClassID[{Combo}='{Combo}']/Special”太好了!你明白了。XPath在任何其他情况下都能很好地为您服务。@AlexanderPetrov我的错……正如我所说,我仍然是个笨蛋。我来修正术语。谢谢
string strXPath= "//ClassID[@Barbarian='Barbarian']/Special"
XmlNodeList specials = doc.SelectNodes( strXPath );