所以我有这个代码,应该允许我列出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。到目前为止它没有。
答案 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();
items
将List<string>
包含在适当的XML文档部分下的所有方案。