【问题标题】:Specific xml child based on combobox selected item基于组合框选定项的特定 xml 子项
【发布时间】:2020-12-16 04:27:17
【问题描述】:

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

我有一个从 xml 文件填充的 ComboBox。当我在 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>

我可以让列表框填充所有“特殊”元素,但我只想要指定类名(即野蛮人属性)的元素。

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

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

LoadFeats 通过 ComboBox SelectedItemChanged 事件调用。

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

编辑:TL;DR 解决方案:

public static List&lt;string&gt; GetSpecialsFromXml(string filename, string tagname) 更改为public List&lt;string&gt; 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 );

【问题讨论】:

  • @AlexanderPetrov 我的错……就像我说的,我还是个菜鸟。我会修正术语。谢谢!

标签: c# xml children


【解决方案1】:

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

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

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

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

XmlNodeList specials = doc.SelectNodes( strXPath );

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

祝你的项目好运

【讨论】:

  • 这看起来很有希望。但是,我需要将 strXpath 设置为 ComboBox.SelectedItem 对吗?到目前为止,当我尝试使用它时,它会给出“对象引用”错误。看来 ClassID 使用的参数正确吗?如何将参数设置为 ComboBox.SelectedItem?特别是如果它给出了对象引用错误?谢谢!
  • 我必须从public static List&lt;string&gt; GetSpecialsFromXml(string filename, string tagname) 中删除“静态”,现在我可以引用组合框了。现在将该值放入“strXpath”。
  • 能够使用 string Combo = ComboBox.Text;$"ClassID[{Combo}='{Combo}']/Special"; 在 ComboBox.Text 中添加
  • 太棒了!你说对了。 XPath 可以很好地应对任何其他情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多