HtmlAgilityPack SelectNodes-Ausdruck, um ein Element mit einem bestimmten Attribut zu ignorieren

c# html-agility-pack selectnodes xpath

Frage

Ich versuche, Knoten außer Skriptknoten und eine ul auszuwählen, die eine Klasse namens 'relativeNav' hat. Kann mir bitte jemand den richtigen Weg weisen? Ich habe seit einer Woche nach diesem gesucht und ich kann es nirgendwo finden. Momentan habe ich das aber natürlich auch die // ul [@ class = 'relativeNav'] ausgewählt. Gibt es einen NOT-Ausdruck, um SelectNode zu ignorieren?

        foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//body//*[not(self::script)]/text()"))
        {
            Console.WriteLine("Node: " + node);
            singleString += node.InnerText.Trim() + "\n";
        }

Akzeptierte Antwort

Gegeben ein Html-Dokument mit einer ähnlichen Struktur wie:

<html>
<head><title>HtmlDocument</title>
</head>
<body>
<div>
<span>Hello Span World</span>
<script>
Script Text
</script>
</div>
<ul class='relativeNav'>
<li>Hello </li>
<li>Li</li>
<li>World</li>
</ul>
</body>
</html>

Der folgende XPath-Ausdruck wählt alle Knoten aus, bei denen es sich nicht um Script-Elemente handelt, die alle untergeordneten Elemente von UL-Elementen mit der Klasse 'relativeNav' ausschließen:

var nodes = htmlDoc.DocumentNode.SelectNodes("//body//*[not(parent::ul[@class='relativeNav']) and not(self::script)]/text()");

Update: vergessen zu erwähnen, dass, wenn Sie alle Kinder von ul [class = 'relativeNav'] ungeachtet ihrer Tiefe ausschließen müssen:

"//body//*[not(ancestor::ul[@class='relativeNav']) and not(self::script)]/text()"

Wenn Sie auch das ul-Element ausschließen möchten (im obigen Beispiel etwas irrelevant, da das Element keinen Text enthält), sollten Sie Folgendes angeben:

"//body//*[not(ancestor-or-self::ul[@class='relativeNav']) and not(self::script)]"

Beliebte Antwort

Ich hoffe, das ist was du brauchst:

HtmlDocument doc = new HtmlDocument();
var nodesToExclude1 = doc.DocumentNode.SelectNodes("//ul[@class='relativeNav']");
var nodesToExclude2 = doc.DocumentNode.SelectNodes("//body//script");
var requiredNodes = doc.DocumentNode.SelectNodes("//")
                       .Where(node => !nodesToExclude1.Contains(node) &&
                                      !nodesToExclude2.Contains(node));

foreach (HtmlNode node in requiredNodes)
{
    Console.WriteLine("Node: " + node);
    singleString += node.InnerText.Trim() + "\n";
}


Related

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