2011-12-22 13 views
0

XDocumentを使用してxmlを読み込む際のヘルプが必要です。 xmlはWPFのHierarchicalDataTemplateのデータを保持しているため、各要素は同じ属性を持ちます。XDocumentを使用して重複するXML属性を読み込む

重複する属性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

私は ''

、 '' 、および 'item'は' MenuItem'する必要があり、両方の私の理解で正しいでしょうか?そして、私は、 ''に ' 'も含めることができると訂正していますか?または、それは ''レベルで停止しますか? – user7116

+0

私はあなたが何を意味するのか、ルートはメニューです、次の要素は属性を持つメニューです、次に属性を持つitemlist(オプション)、属性を持つ次のアイテム(属性もあります)上記のxmlでは、メニューid = 1はitemlistメニューid = 2は2つのitemlistを持っていますが、2番目のonだけがitemを持っています。項目リストには属性と項目のみが含まれます。 –

答えて

0

これは、それらがMenuItemの直接の要素と属性であることを前提としています。私が疑うことは、要素itemslistとitemの属性を読み込む必要があるということです。 1つのループでそれを行う方法がわかりません。要素をループし、その要素をループする必要があります(親要素ではない)。

0

あなたの処理では、世の中ではありません。

enter image description here

方法を参照してください:ここで

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から見られるような結果である:

私はここにあなたのXMLを調整しますが、しているが、あなたがそれを処理する方法の例です。データが解析されます。つまり、メニュー構造に取り込むためにはどのように処理する必要がありますか。重複する属性はありません。 :-)

HTH

関連する問題