2012-05-01 23 views
0

私はこれのようなxmlを持っています。属性値からXML xElementノードを選択して反復する方法は?

<?xml version="1.0" encoding="utf-8" ?> 
<Category ID="1" AICategoryName="Schedule K: Income/Loss" Taxonomy="K"> 
    <Level1 ID="11965" Name="Guaranteed payments" Taxonomy="4"> 
     <Level2 ID="27058" Name="Gtd Pmts(trade/bus) to Sch. M-1" Taxonomy="1"> 
     </Level2> 

     <Level2 ID="27059" Name="Gtd Pmts not to Sch. M-1" Taxonomy="2">  
     </Level2> 
    </Level1> 

    <Level1 ID="119652" Name="2Guaranteed payments" Taxonomy="4"> 
     <Level2 ID="227058" Name="2Gtd Pmts(trade/bus) to Sch. M-1" Taxonomy="1"> 
     </Level2> 

     <Level2 ID="227059" Name="2Gtd Pmts not to Sch. M-1" Taxonomy="2">  
     </Level2> 
    </Level1> 
</Category> 

親ノードの属性IDを指定することで、親ノードの下に子ノードを取得したいと考えています。

たとえば、Level1と11965を提供する場合、すべてのレベル2ノードとその名前とIDを取得する必要があります。

私はこのコードを試しました。

XDocument xd = XDocument.Load(xmlPath); 

     var xl = from xml2 in xd.Descendants("Level1") 
       where xml2.Parent.Attribute("ID").Value == parentNode.ID 
       select xml2; 

しかし、コードyeilds結果はありません。一度xlを取得すると、子ノード名とIDを取得するためにどのように反復処理を行うことができますか?

+0

'xd.Descendants( "レベル1")'(、あなたが正しいない子孫_of_ Level' –

答えて

2
XDocument xd = XDocument.Load(xmlPath); 
var nodes = (from n in xd.Root.Desendants(tagName/*Level1*/) where n.Attribute("Id").Value == "idValue" select n.Elements()).single().select(n=>{return new{ 
Id = n.attribute("Id").value, 
Name = n.attribute("Name").value, 
Taxonomy = n.attribute("Taxonomy").value 
}}); 

要求されたタグ名が常に "Level1"でxml struvvtureがこれに固定されている場合は、上記のコードを変更することもできます。

XDocument xd = XDocument.Load(xmlPath); 
var nodes = (from n in xd.Root.Elements("Level1") where n.Attribute("Id").Value == "idValue" select n.Elements()).single().select(n=>{return new{ 
    Id = n.attribute("Id").value, 
    Name = n.attribute("Name").value, 
    Taxonomy = n.attribute("Taxonomy").value 
    }}); 
+0

、レベル1を_are_要素を選択シングル)を使用した方が良い、ファーストよりも()upvoteのための –

+0

thankx ..このコードはあなたの問題を解決するdosent? –

+0

それは私who upvoted whoだった:) –

1

LINQ(あなたが常に提供されたIDのための単一のレベル1のノードを取得すると仮定):

XDocument xd = XDocument.Load(xmlPath); 
int parentId = 119652; 
var nodes = (from level1 in xd.Descendants("Level1") 
      where ((int)level1.Attribute("ID")) == parentId 
      select level1.Descendants("Level2")) 
      .Single() 
      .Select(level2 => new { ID = (int)level2.Attribute("ID"), 
            Name = level2.Attribute("Name").Value }); 

反復

foreach (var level2 in nodes) 
    // level2.Name and level2.ID 

場合がござい可能レベル1のノードは、提供されたIDには存在しないか、あなたには、いくつかのレベル1ノードを持っていること同じIDを持つ:

int parentId = 119652; 
XDocument xd = XDocument.Load(xmlPath); 
var query = xd.Descendants("Level1") 
       .Where(level1 => ((int)level1.Attribute("ID")) == parentId) 
       .SelectMany(level1 => level1.Descendants("Level2")) 
       .Select(level2 => new { ID = (int)level2.Attribute("ID"), 
             Name = level2.Attribute("Name").Value }); 

foreach (var level2 in query) 
    // level2.Name and level2.ID 
関連する問題