从元素中的元素加载属性

时间:2013-12-08 22:38:29

标签: c# xml foreach linq-to-xml

所以我有这个代码,应该允许我列出xml文件中另一个元素(elementception?)中元素内的元素的所有属性。我要做的是让第一个列表(我的代码中为lst_adventure)加载第一级元素属性(名称属性)。在选择所述元素之一时,列表2(lst_adventures带有s)加载先前选择的元素中的下一级元素。选择第二级元素后,列表3(lst_senario)将加载前一元素中前一元素内的场景元素。尝试解释有点令人困惑。但是现在hwat正在喋喋不休地说它会完美地加载第一和第二个元素,但第三个列表仍然是空的。任何帮助都会很棒。

    string selectedItem = lst_Adventure.SelectedItem.ToString();
    string selectedAdventure = lst_Adventures.SelectedItem.ToString();

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

我正在使用的xml文件就是这个 -

<?xml version="1.0" encoding="utf-8" ?> 
<adventures>
  <adventure_path Name ="Adventure Path 1">
    <adventure Name ="Adventure 1">
      <senario Name ="Senario 1"/>
      <senario Name ="Senario 2"/>
    </adventure>
    <adventure Name="Addventure 2">
      <senario Name ="Senario 3"/>
    </adventure>
  </adventure_path>
  <adventure_path Name ="Adventure Path 2">
    <adventure Name ="Adventure 3">
      <senario Name ="Senario 4"/>
      <senario Name ="Senario 5"/>
    </adventure>
  </adventure_path>
</adventures>

因此,代码应将每个方案名称属性添加到lst_adventure和lst_adventures中所选项目中的lst_scenario。到目前为止它没有。

1 个答案:

答案 0 :(得分:0)

以下工作正常:

string selectedItem = "Adventure Path 1";
string selectedAdventure = "Adventure 1";

var doc = XDocument.Load("Input.txt");

var selectedElement = doc.Root
                         .Elements("adventure_path")
                         .Where(x => (string)x.Attribute("Name") == selectedItem)
                         .FirstOrDefault();
var selectedAdventures = selectedElement.Elements("adventure")
                                        .Where(x => (string)x.Attribute("Name") == selectedAdventure)
                                        .FirstOrDefault();

var items = new List<string>();

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

您将Name属性值与相同的selectedItem变量值进行两次比较。我还更改了Descendants次来电Root / Elements()次来电,因为您不应该使用Descendants,除非您的数据是树状的。据我所见,你的不是。

您可以在单个查询中执行相同操作:

var items = doc.Root
               .Elements(selectedItem)
               .FirstOrDefault(x => (string)x.Attribute("Name") == selectedItem)
               .Elements(selectedAdventure)
               .FirstOrDefault(x => (string)x.Attribute("Name") == selectedAdventure)
               .Elements("senario")
               .Select(x => (string)x.Attribute("Name"))
               .ToList();

itemsList<string>包含在适当的XML文档部分下的所有方案。