基于组合框所选项目的特定 xml 个子项

Specific xml child based on combobox selected item

这可能是重复的,但我一直无法找到解决方案。

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

xml:

 <ClassID Barbarian="Barbarian">
    <Name>Barbarian</Name>
    <Alignment>NG CG NN CN NE CE</Alignment>
    <Special>Fast Movement</Special>
    <Special>Rage Power</Special>
 </ClassID>

我可以让 listBox 填充所有“特殊”元素,但我只想要指定 class 名称(即 Barbarian 属性)的元素。

用所有“特殊”元素填充 listBox 的代码,无论 ComboBox 项目是什么 selected:

//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());
}

使用 ComboBox SelectedItemChanged 事件调用 LoadFeats。

我在处理 xml 个文件时仍然是个菜鸟。

编辑:TL;DR 解决方案:

已将 public static List<string> GetSpecialsFromXml(string filename, string tagname) 更改为 public List<string> GetSpecialsFromXml(string filename, string tagname)

添加了 string Combo = ComboBox.Text;string strXPath = $"ClassID[{Combo}='{Combo}']/Special"

已替换 XmlNodeList specials = doc.GetElementsByTagName(tagname); XmlNodeList specials = doc.SelectNodes( strXPath );

在 SelectNodes() 函数调用中使用 XPath,而不是使用 doc.GetElemnetByTagName 查找“tagname”。 XPath 之于 XML 就像 SQL 之于数据库,而且非常强大。

像在“SelectNodes()”调用中一样使用 XPath 语句

string strXPath= "//ClassID[@Barbarian='Barbarian']/Special"

替换你的 XmlNodeList specials = doc.GetElementsByTagName(tagname);有了这个

XmlNodeList specials = doc.SelectNodes( strXPath );

然后像您已经在做的那样迭代。

祝你项目顺利