C# 获取每个XML根节点的子节点数

C# 获取每个XML根节点的子节点数,c#,xml,C#,Xml,这就是XML的外观 <nvd xmlns:scap-core=....> <entry id="CVE-2015-0001"> <vuln:vulnerable-configuration id="http://www.nist.gov/"> <cpe-lang:logical-test operator="OR" negate="false"> <cpe-lang:fact-ref na

这就是XML的外观

<nvd xmlns:scap-core=....>
  <entry id="CVE-2015-0001">
     <vuln:vulnerable-configuration id="http://www.nist.gov/">
        <cpe-lang:logical-test operator="OR" negate="false">
            <cpe-lang:fact-ref name="cpe:/o:microsoft:windows_8:-"/>
            <cpe-lang:fact-ref name="cpe:8.1:-"/>
            <cpe-lang:fact-ref name="cpe:/o:microer_2012:-:gold"/>
            <cpe-lang:fact-ref name="cpe:/o:microsoft:w~~"/>
这就是我试过的

var document = XDocument.Load("nvdcve-2.0-2015.xml");
var root = document.Root;
var elements = root.Descendants("entry");
foreach (var entry in elements)
{
    string id = entry.Attribute("id").Value; 
    var cpe = entry.Elements("cpe-lang:fact-ref");
    int nr = 0;
    foreach (var item in cpe)
    {
        nr++;
    }    
Console.WriteLine(id + " " + nr );
}
你就快到了:

var cpe = entry.Descendants("cpe-lang:fact-ref");
但实际上,您不需要内部循环:

foreach (var entry in elements)
{
    var id = entry.Attribute("id").Value;
    var factRefsCount = entry.Descendants("cpe-lang:fact-ref").Count();
    Console.WriteLine(id + " " + factRefsCount);
}
更改此行:

var elements = root.Descendants("entry");
将是:

var elements = root.Descendants()
                   .Where(x => x.Name.LocalName == "entry");
您在入口节点上有一个名称空间,由于我们无法看到它,因此无法帮助您。但是,上面将找到名为entry的所有节点


您的行正在查找没有名称空间的节点—没有名称空间条目的节点,并且没有名称空间。

控制台中仍然没有任何内容。它不会循环。应该说它甚至不会循环一次。
var elements = root.Descendants()
                   .Where(x => x.Name.LocalName == "entry");