我需要帮助使用XDocument
加载xml。 xml保存WPF中HierarchicalDataTemplate
的数据,因此每个元素都具有相同的属性。
我遇到了一个关于如何处理重复属性Name,image和fileLoc的新手问题。
我试图获得类似下面代码的功能,但是你可以看到重复的属性不起作用。
public static List<MenuItem> Load(string MyMenuFile)
{
var mymenu = XDocument.Load(MyMenuFile).Root.Elements("Menu").Select(
x => new MenuItem(
(string)x.Attribute("id"),
(string)x.Attribute("name"),
(string)x.Attribute("image"),
(string)x.Attribute("fileLoc"),
(string)x.Element("itemlist"),
(string)x.Attribute("name"),
(string)x.Attribute("image"),
(string)x.Attribute("fileLoc"),
(string)x.Element("item"),
(string)x.Attribute("name"),
(string)x.Attribute("image"),
(string)x.Attribute("fileLoc")));
return stationfiles.ToList();
}
这是xml:
<Menus>
<Menu id="1" Name="Level1" image="C:\lvl1.jpg" fileLoc="C:\lvl1.xml">
</Menu>
<Menu id="2" Name="Level2" image="C:\lvl2.jpg" >
<itemlist Name="Level2" image="C:\lvl2.jpg" fileLoc="C:\lvl2.xml">
</itemlist>
<itemlist Name="Level3" image="C:\lvl3.jpg">
<item Name="First" image="C:\first.jpg" fileLoc="C:\first.xml"></item>
<item Name="Second" image="C:\second.jpg" fileLoc="C:\second.xml"></item>
<item Name="Third" image="C:\third.jpg" fileLoc="C:\third.xml"></item>
</itemlist>
</Menu>
</Menus>
如您所见,不同的元素但重复的属性。我应该有3个单独的类,但是如何将它们组合起来用于XDocument
加载?任何帮助都会很棒。
答案 0 :(得分:0)
这假设它们是MenuItem的元素和属性。我怀疑你需要阅读元素itemslist和items的属性。不确定如何使用单个循环执行此操作。您需要循环遍历元素,然后循环该属性,使其成为THAT元素(而不是父元素)。
答案 1 :(得分:0)
你的处理过程并不是很好的。
我已经调整了你的xml,但这里有一个如何处理它的例子:
string xml = @"<?xml version=""1.0"" encoding=""UTF-8""?>
<Menus>
<Menu id=""1"" Name=""Level1 - Alpha"" image=""C:\lvl1.jpg"" fileLoc=""C:\lvl1.xml""/>
<Menu id=""2"" Name=""Level1 - Beta"" image=""C:\lvl2.jpg"" fileLoc=""C:\lvl1.xml"" >
<itemlist Name=""Level2-Gamma"" image=""C:\lvl2.jpg"" fileLoc=""C:\lvl2.xml""/>
<itemlist Name=""Level3-Zeta"" image=""C:\lvl3.jpg"" fileLoc=""C:\lvl1.xml"">
<item Name=""First"" image=""C:\first.jpg"" fileLoc=""C:\first.xml""></item>
<item Name=""Second"" image=""C:\second.jpg"" fileLoc=""C:\second.xml""></item>
<item Name=""Third"" image=""C:\third.jpg"" fileLoc=""C:\third.xml""></item>
</itemlist>
</Menu>
</Menus>";
var xd = XDocument.Parse(xml);
var result =
xd.Descendants("Menu")
.Select (l1 => new
{
Name = l1.Attribute("Name").Value,
Image = l1.Attribute("image").Value,
File = l1.Attribute("fileLoc"),
Children = l1.Descendants("itemlist")
.Select (l2 => new {
Name = l2.Attribute("Name").Value,
Image = l2.Attribute("image").Value,
File = l2.Attribute("fileLoc"),
Children = l2.Descendants("item")
.Select (l3 => new {
Name = l3.Attribute("Name").Value,
Image = l3.Attribute("image").Value,
File = l3.Attribute("fileLoc")
})
})
});
Console.WriteLine (result );
以下是从linqpad找到的结果:
查看数据如何解析,这就是您需要如何处理它以使其进入菜单结构。没有重复的属性。 : - )
HTH