0

私はこのようなxmlを持っています。

<?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;

しかし、コードは結果をもたらしません。また、xl を取得したら、それを繰り返し処理して子ノードの名前と ID を取得するにはどうすればよいですか?

4

2 に答える 2

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 構造がこれに固定されている場合は、上記のコードを変更することもできます。

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
    }});
于 2012-05-01T07:21:41.670 に答える
1

LINQ (提供された ID に対して常に単一の Level1 ノードを取得するとします):

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

指定された ID の Level1 ノードが存在しない可能性がある場合、または同じ ID を持つ複数の Level1 ノードがある場合:

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
于 2012-05-01T07:09:06.677 に答える