HtmlAgilityPack несколько тел в таблице

c# html-agility-pack

Вопрос

В таблице есть несколько Tbodies, и я пытаюсь их разобрать, используя HTMLagilitypack. Обычно код ниже работал бы, но это не так. Сейчас он печатает только первый тём и игнорирует второй.

Код

var tableOffense =  doc.DocumentNode.SelectSingleNode("//table[@id='OFF']");
                var tbody = tableOffense.SelectNodes("tbody");
                foreach(var bodies in tbody)
                {
                    Console.WriteLine("id "+offender.offenderId +" "+ Utilities.RemoveHtmlCharacters(bodies.InnerText));
                }

HTML

<table id="OFF" class="centerTable" cols="2" style="margin-top:0; width:100%;" cellpadding="0" cellspacing="0">   
<tbody>
<!-- %%$SPLIT  -->
  <tr>         <th id="offenseCodeColHdr" scope="row" style="width:25%;" class="uline">Offense Code</th>         <td headers="offenseCodeColHdr" class="uline">288(a)</td>          </tr>       <tr>         <th id="descriptionColHdr" scope="row" style="width:25%;" class="uline">Description</th>         <td headers="descriptionColHdr" class="uline">LEWD OR LASCIVIOUS ACTS WITH A CHILD UNDER 14 YEARS OF AGE</td>             </tr>           <tr>         <th id="lastConvictionColHdr" scope="row" style="width:25%;" class="uline">Year of Last Conviction</th>         <td headers="lastConvictionColHdr" class="uline">&nbsp;</td>       </tr>       <tr>          <th id="lastReleaseColHdr" scope="row" style="width:25%;" class="uline">Year of Last Release</th>         <td headers="lastReleaseColHdr" class="uline">&nbsp;</td>       </tr>
  <tr><th colspan="2"><hr style="height:2px;background-color:#000;"></th></tr>         </tbody>
<!-- %%$SPLIT  -->
  <tbody><tr>         <th id="offenseCodeColHdr" scope="row" style="width:25%;" class="uline">Offense Code</th>         <td headers="offenseCodeColHdr" class="uline">261(a)(2)</td>            </tr>       <tr>         <th id="descriptionColHdr" scope="row" style="width:25%;" class="uline">Description</th>         <td headers="descriptionColHdr" class="uline">RAPE BY FORCE OR FEAR</td>          </tr>           <tr>         <th id="lastConvictionColHdr" scope="row" style="width:25%;" class="uline">Year of Last Conviction</th>         <td headers="lastConvictionColHdr" class="uline">&nbsp;</td>       </tr>       <tr>          <th id="lastReleaseColHdr" scope="row" style="width:25%;" class="uline">Year of Last Release</th>         <td headers="lastReleaseColHdr" class="uline">&nbsp;</td>       </tr>
  <tr><th colspan="2"><hr style="height:2px;background-color:#000;"></th></tr>         </tbody>
<!-- %%$SPLIT  -->
</table>

Я напечатал только узел tableOffense сам по себе, чтобы убедиться, что 2-й тел существует при загрузке, и это так.

Вопрос: Почему код выводит только первый текст, а не тот и другой?

Принятый ответ

Я не понял, почему ваш код дает вам только одно, но могу ли я предложить альтернативное решение, чтобы выбрать все ваши элементы <tbody> ?

Лично я хотел бы использовать XPAth и просто выбрать все элементы tbody за один раз без дополнительных SelectNodes() :

var tbody = doc.DocumentNode.SelectNodes("//table[@id='OFF']//tbody");
foreach (var elem in tbody)
{
    //Dump only works in LinqPad
    elem.InnerText.Dump();
}

Редактировать:

Следующий код (ваш код) также дает те же результаты

var tableOffense =  doc.DocumentNode.SelectSingleNode("//table[@id='OFF']");
var tbody = tableOffense.SelectNodes("//tbody");


Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему