seleziona il prossimo nodo html Agility pack C #

c# filtering html-agility-pack regex

Domanda

Sono uno studente che lavora con htmlagilitypack per la 1a volta. Attualmente sto filtrando l'html per ottenere i valori usando

foreach (HtmlNode link in bodyNode.SelectNodes("//span[@class='content-b']"))
{
    if (link.InnerText.Contains("Name"))
    {
        //MessageBox.Show("Found");
        textBox1.Text += "Name : " + ?????;
    }

    textBox1.Text += link.InnerText;
}

Come puoi vedere, sto verificando se il nodo corrente contiene un valore "NAME" e, in tal caso, desidero ottenere il valore del prossimo nodo accanto ad esso. Sarò molto grato se puoi aiutarmi con questo.

Il valore del nome è nel nodo successivo <div class='content-b'>THIS IS MY NAME</div> .. come posso dire in modo problematico a C # di ottenere il nodo successivo prima di ripetere il ciclo?

Grazie.


Aggiornamento: Ecco il frammento di codice html con cui sto lavorando, Sembra brutto, mi dispiace non poterlo aiutare

foreach (HtmlNode link in bodyNode.SelectNodes("//span[@class='content-b']"))
{
    if (link.InnerText.Contains("Name"))
    {
        //MessageBox.Show("Found");
        textBox1.Text += "Name : " + ?????;
    }

    textBox1.Text += link.InnerText;
}

Grazie.

Risposta accettata

Innanzitutto, non c'è class="content-b" nel tuo documento. Sono tutti scritti come contet-b .

In secondo luogo, poiché l'html non è ben formato, NextSibling non funzionerà. È necessario ottenere manualmente il nodo successivo che corrisponde ai criteri. Non è possibile utilizzare un ciclo foreach in questa situazione.

Ecco il risultato:

var nodes = bodyNode.SelectNodes("//div[@class='contet-b']").ToList();
for( int i =0; i < nodes.Count; i++)
{
    var link = nodes[i];
    if (link.InnerText.Contains("Name"))
    {
        textBox1.Text += "Name : ";
        if (i + 1 < nodes.Count)
        {
            // append the value of next matching `div` node
            textBox1.Text += nodes[i + 1].InnerText.Trim();
            i++; // skip this node
        }
    }
}

Risposta popolare

Quello che stai cercando è la proprietà NextSibling del nodo. Nel tuo esempio:

foreach (HtmlNode link in bodyNode.SelectNodes("//div[@class='content-b']"))
{
    if (link.InnerText.Contains("Name"))
    {
        //MessageBox.Show("Found");
        textBox1.Text += "Name : " + link.NextSibling.InnerText;
    }

    textBox1.Text += link.InnerText;
}



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché