这可能是重复的,但我还没有找到解决方案。
我有一个从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 );
然后像你已经在做的那样迭代。
祝你的项目好运