HtmlAgility comprueba si existe una subclase con un nombre específico

c# html-agility-pack

Pregunta

<li class="sn-g">
     <span class="num">1</span>
     <span class="sym_first">
          <a class="icon>&nbsp;</a>
     </span>
     <span class="def">...text</span>
</li>

Mi página HTML contiene tales subclases. Sin embargo, la clase sym_first no siempre está presente. Usando HTMLAgility, quiero saber si existe la clase sym_first en la página web. Si existe quiero obtener el texto interno de la clase def .

foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//span[@class='" + sng + "']"))
{
   //How do I write this block?
   if(doc.DocumentNode.SelectNodes("//span[@class='" + symfirst + "']").Contains(xxx)
   {
      //get inner text
   }
} 

Respuesta popular

Puede intentar usar SelectSingleNode() y verificar si el valor de retorno no es null :

if(doc.DocumentNode.SelectSingleNode("//span[@class='sym_first']") != null)
{
    //get inner text
}

o si quiere verificar la clase sym_first dentro de li actual (asumiendo que está haciendo un bucle a través de li en el fragmento de código en cuestión):

if(node.SelectSingleNode("span[@class='sym_first']") != null)
{
    //get inner text
}

ACTUALIZACIÓN:

En respuesta al error reportado en el comentario a continuación, intente verificar si también existe la clase def :

var sym_first = node.SelectSingleNode("span[@class='sym_first']");
var def = node.SelectSingleNode("span[@class='def']");
if(sym_first != null && def != null)
{
    //get inner text
}

Dependiendo de los requisitos, es posible que desee iterar solo a través de elementos li que tienen este contenido específico en primer lugar:

var query = "//li[@class='sn-g'][span[@class='sym_first'] and span[@class='def']]";
foreach (HtmlNode node in doc.DocumentNode.SelectNodes(query))
{
   //get inner text
} 


Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow