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



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

我有一个从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填充所有";特别的";元素,但我只想要指定类名的元素(即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());
}

LoadFeatures是使用ComboBox SelectedItemChanged事件调用的。

在处理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 );

而不是寻找"标记名";,与医生。GetElemnetByTagName,在SelectNodes((函数调用中使用XPath。XPath对XML的作用就像SQL对数据库的作用一样,而且非常强大。

使用XPath语句,如在";选择节点(("调用

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

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

XmlNodeList specials = doc.SelectNodes( strXPath );

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

祝你的项目好运

最新更新