使用XDocument加载重复的XML属性

时间:2011-12-22 18:53:22

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

我需要帮助使用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加载?任何帮助都会很棒。

2 个答案:

答案 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找到的结果:

enter image description here

查看数据如何解析,这就是您需要如何处理它以使其进入菜单结构。没有重复的属性。 : - )

HTH