2011-12-22 45 views
0

我需要使用XDocument加載xml的幫助。 xml保存WPF中HierarchicalDataTemplate的數據,因此每個元素都具有相同的屬性。使用XDocument加載重複的XML屬性

我有一個新手問題,如何處理重複的屬性名稱,圖像和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

我是在我的理解是否正確,這兩個'

',''和'item'應該是'MenuItem'?我是否正確地認爲''也可以有''?或者它停止在''的水平? – user7116 2011-12-22 19:49:11

+0

我明白你的意思,根是菜單,下一個元素是帶有屬性的菜單,接下來將是帶有屬性的itemlist(可選),下一個將帶有屬性的項目(也是可選的)在上面的xml中,Menu id = 1沒有itemlist或項目,菜單id = 2有兩個項目表,但只有第二個項目。一個物品清單隻有屬性和物品。 – 2011-12-22 20:39:26

回答

0

這裏假定那些元素和屬性直接是MenuItem的。我懷疑的是你需要閱讀元素itemslist和items的屬性。不知道如何用一個循環來完成。你需要遍歷元素,然後循環這個元素的屬性(不是父元素)。

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