基于组合框所选项目的特定 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 );
然后像您已经在做的那样迭代。
祝你项目顺利
这可能是重复的,但我一直无法找到解决方案。
我有一个从 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 );
然后像您已经在做的那样迭代。
祝你项目顺利