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 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
    }});
于 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 回答