0

所以我有这段代码应该让我的xml文件在选择前一个元素后读出每个后代元素的属性。这是我正在使用的 xml -

<?xml version="1.0" encoding="utf-8" ?> 
<adventures>
  <adventure_path Name ="Adventure Path 1">
    <adventure Name ="Adventure 1">
      <senario Name ="Senario 1">
        <location Name="Location 1" Players="1"/>
        <location Name="Location 2" Players="1"/>
      </scenario>
      <senario Name ="Senario 2">
        <location Name="Location 3" Players="1"/>
        <location Name="Location 4" Players="1"/>
      </scenario>
    </adventure>
    <adventure Name="Addventure 2">
      <senario Name ="Senario 3">
        <location Name="Location 5" Players="1"/>
        <location Name="Location 6" Players="1"/>
      </scenario>
    </adventure>
  </adventure_path>
  <adventure_path Name ="Adventure Path 2">
    <adventure Name ="Adventure 3">
      <senario Name ="Senario 4">
        <location Name="Location 7" Players="1"/>
        <location Name="Location 8" Players="1"/>
      </scenario>
      <senario Name ="Senario 5">
        <location Name="Location 9" Players="1"/>
        <location Name="Location 10" Players="1"/>
      </scenario>
    </adventure>
  </adventure_path>
</adventures>

所以基本上应该发生什么程序列出了listbox1中的所有冒险路径,我选择了其中一条冒险路径。该程序列出了所选冒险路径内的所有冒险,我选择了一个。最后,程序列出了所选冒险中的所有场景。目前发生的情况是它会完美地完成前两个列表,但是当我在第二个列表中选择冒险时,我似乎无法让它列出任何场景。它不会崩溃,只是没有列出它们。任何帮助都会很棒,这是我应该列出所有场景的代码。

 private void lst_Adventures_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    string selectedItem = lst_Adventure.SelectedItem.ToString();
    string selectedAdventure = lst_Adventures.SelectedItem.ToString();

    lst_Senarios.Items.Clear();

    System.Console.WriteLine(selectedItem);

    XDocument doc = new XDocument();

    doc = XDocument.Load("D:\\WpfApplication1\\WpfApplication1\\Adventures.xml");

    XElement selectedElement = doc.Descendants().Where(x => (string)x.Attribute("Name") == selectedItem).FirstOrDefault();
    XElement selectedAdventures = selectedElement.Descendants().Where(x => (string)x.Attribute("Name") == selectedItem).FirstOrDefault();

    if (selectedAdventures != null)
    {
        foreach (var docs in selectedAdventures.Elements("senario"))
        {
            string AdventuresPathName = docs.Attribute("Name").Value;
            lst_Adventures.Items.Add(AdventuresPathName);
        }
    }
}
4

1 回答 1

0

我刚刚使用您提供的 xml 尝试了您的代码,并且注意到了一些缺陷。当这些得到纠正时,您的代码将按预期运行(如果我没有误解您的期望):

  1. 的开始标签senario与结束标签不匹配scenarioscenario如果您将开始标签更改为,请不要忘记将 foreach 中的“senario”更改为“scenario”
  2. selectedAdventures 应该与 selectedAdventure 而不是 selectedItem 匹配(如果我没有误解变量)
于 2013-12-09T00:58:06.127 回答