获取每个XML根节点的子节点数
本文关键字:子节点 根节点 XML 获取 | 更新日期: 2024-09-27 04:02:33
这就是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~~"/>
我想得到每个条目的"cpe-lang:fact-ref"节点数,并显示条目id和节点数。
CVE-2015-0001 4
这就是我尝试的
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 elements = root.Descendants("entry");
未来:
var elements = root.Descendants()
.Where(x => x.Name.LocalName == "entry");
你在entry
节点上有一个名称空间,由于我们看不到它,我们无法帮助你。但是,上面会找到所有名为entry
的节点。
您的行正在查找名为entry
的无名称空间节点(没有名称空间的节点),但没有。
您已接近目标:
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);
}