Erhalte die erste und zweite Zelle jeder HTML-Tabellenzeile

.net html-agility-pack xpath

Frage

Ich versuche, mit HTMLAgilityPack nur bestimmte Zellen in jeder Zeile zu bekommen.

foreach (HtmlNode row in ContentNode.SelectNodes("descendant::tr"))
{
    //Do something to first cell
    //Do something to second cell
}

Es gibt mehr Zellen und jede Zelle benötigt eine spezielle Behandlung. Ich denke, es gibt einen Weg, dies mit XPath zu tun, aber ich bin ziemlich nutzlos. Gibt es vielleicht so etwas wie

var cell1 = row.SelectSingleNode("descendant::td:first");

Akzeptierte Antwort

Um jede erste Zelle zu erhalten, die ein Kind einer Zeile ist, können Sie Folgendes tun:

// from row
var firstCell = row.SelectSingleNode("td[1]");

// each first cell in a table (note: tbody is not always there)
var allFirstCells = table.SelectNodes("tbody/tr/td[1]");

Mit anderen Worten, verwenden Sie eckige Klammern und die Zellennummer, die Sie auswählen möchten. Eine Ausnahme ist die letzte Zelle, die Sie mit last() wie folgt erhalten können:

// from row
var lastCell = row.SelectSingleNode("td[last()]");

// each last cell in a table
var allLastCells = table.SelectNodes("tbody/tr/td[last()]");

Wenn Sie die Zelle neben einer aktuellen Zelle abrufen möchten, können Sie Folgendes tun:

// from row
var firstCell = row.SelectSingleNode("td[1]");
var siblingCell = firstCell.SelectSingleNode("./following-sibling::td");

Möglicherweise möchten Sie die Rückgabewerte für null überprüfen, was bedeutet, dass Sie entweder einen Tippfehler haben oder die von Ihnen geladene DOM-Struktur die von Ihnen angeforderte Zelle nicht enthält.


Beliebte Antwort

Statt :

descendant::tr

benutzen :

descendant::tr/td[not(position() >2)]


Related

Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow