2015-03-03 2 views
0

Так выглядит 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 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-Ланг: фактологические-исх» узлов для каждой записи и показывать идентификатор записи и количество узлов.

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); 
} 
+0

Должен сказать, что он не зацикливается ни разу. – greye

ответ

0

Изменить эту строку:

var elements = root.Descendants("entry"); 

Чтобы быть:

var elements = root.Descendants() 
        .Where(x => x.Name.LocalName == "entry"); 

У вас есть пространство имен на entry узле, а так как мы не можем видеть его, мы не можем помочь вам с ним. Но, вышесказанное найдет все узлы с именем entry.

Ваша строка ищет узлы без пространства имен (узлы без пространства имен) с именем entry, и их нет.

+0

Это работает. Спасибо. – greye

0

Вы почти там:

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); 
} 
+0

Все еще ничего в консоли. Он не зацикливается. – greye

+0

Вы делаете что-то не так - https://dotnetfiddle.net/yl4P39 – aush

Смежные вопросы