HtmlAgilityPack überspringt oder entfernt eine geschachtelte Tabelle

html-agility-pack

Frage

Ich verwende HtmlAgilityPack, um den folgenden HTML-Code abzurufen (beachten Sie die geschachtelte Tabelle):

<table class="123">
<tr>
    <table class="789">
    <tr>
        <td>abc</td>
    </tr>
    <tr>
        <td>def</td>
    </tr>
    </table>
</tr>

<tr>
    <td>info 1</td>
</tr>

<tr>
    <td>info 2</td>
</tr>

<tr>
    <td>info 3</td>
</tr>
</table>

Jetzt versuche ich, eine schlaue Methode zu finden, um Informationen aus der Elterntabelle und Informationen aus der verschachtelten Tabelle zu erhalten ...

Bisher habe ich folgendes:

var parentTable = document.DocumentNode.SelectNodes("//table[@class='123']").FirstOrDefault();

var nestedTable = parentTable.SelectNodes("//table[@class='789']").FirstOrDefault();

Ich kann jetzt mit der NestedTable herumspielen und bekomme, was ich will (abc, def) ...

Aber wenn ich versuche, das <tr> vom Elterntisch zu bekommen:

var parentTableRows = parentTable.SelectNodes(".//tr");

Es scheint (in der Sammlung) auch die <tr> aus der verschachtelten Tabelle zu enthalten ...

Mit anderen Worten, nach dem obigen HTML-Code hatte ich erwartet, dass ich eine Sammlung von 4 <tr> s hatte, aber da sie die <tr> aus dem verschachtelten Tisch enthält, bekomme ich eine Sammlung von 6 <tr> .

Wie kann ich den ersten <tr> überspringen, der die geschachtelte Tabelle enthält, damit ich herumspielen und die Informationen bekommen kann, die ich möchte (info1, info2, info3) (hoffe, dass ich einen Sinn habe ...)

Danke im Voraus!

Akzeptierte Antwort

// ist ein XPATH-Ausdruck, der "alle Knoten und Unterknoten scannen" bedeutet. Deshalb erhält //tr alle tr unterhalb des root.

Wenn Sie nur parentTable.SelectNodes("tr") (oder "./tr" was äquivalent ist) tun, werden Sie alle TR unterhalb der Stamm-TR auswählen.

Wenn Sie den ersten überspringen möchten, können Sie einen XPATH-Filter für die position() Elements position() (eine XPATH-Funktion) hinzufügen:

var parentTableRows = parentTable.SelectNodes("tr[position() > 1]");


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum