2012-05-01 54 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> 

我想通过提供父节点attribite 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级”)'选择该_are_ 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结构已修复,那么您也可以更改上面的代码。

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

你是对的元素,单()是更好地使用,比第一() –

+0

thankx为给予好评..这个代码也解决了你的问题剂量吗? –

+0

这就是我upvoted :) –

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