re: test () XPath zu HtmlAgilityPack (holt alle p Tags mit übereinstimmendem Regex intern)

c# html html-agility-pack xpath

Frage

Ich möchte alle <p>=.+=</p> -Tags. Die Regex funktioniert eigenständig ohne die <p> -Tags.

Hier ist mein XPath: "//p[re:test(.,'^=.+=$', 'i')]"

Aber ich bekomme eine Ausnahme, wenn ich es einstecke,

HtmlNodeCollection pNodes = htmlDoc.DocumentNode.SelectNodes("//p[re:test(.,'^=.+=$', 'i')]");

Die Ausnahme ist:

Namespace Manager oder XsltContext benötigt. Diese Abfrage hat ein Präfix, eine Variable oder eine benutzerdefinierte Funktion.

Edit: Der Html wird von FCKEditor generiert und hat keinen Namespace definiert. Muss ich etwas einstellen, damit dies funktioniert?

Der HTML:

<p><style type="text/css">
h2 a { color: black; }</style></p>
<p>----</p>
<h2>test <a href="http://searisen.com">link</a></h2>
<p>== Heading 2 ==</p>
<p>----</p>
<p>=== Heading [http://searisen.com SeaRisen.com] ===</p>

Akzeptierte Antwort

Der Fehler, den Sie haben, ist darauf zurückzuführen, dass der Ausdruck re:test eine XPATH-Funktion namens test (die in einem Namespace deklariert ist, dessen Präfix re ), der dem XSLT-Kontext nicht bekannt ist.

Ich weiß nicht, woher du diesen Ausdruck hast, aber es ist kein Standard, also bedeutet es nichts im Zusammenhang mit dem Html Agility Pack :-)

Eine ausführliche Erklärung finden Sie in diesem coolen Artikel hier: Hinzufügen von benutzerdefinierten Funktionen zu XPath . Beachten Sie könnte es mit diesen Techniken arbeiten.

Das heißt, hier eine "reine" Html Agility Pack / XPATH Implementierung:

var pNodes = htmlDoc.DocumentNode.SelectNodes("//p[text()='=.+=']");

Es verwendet einen Filter (zwischen [und]) und die Standard-XPATH-Funktion text (), was "innerer Text" bedeutet.


Beliebte Antwort

Scheinbar behandelt HtmlAgilityPack keine Namespaces (nicht dass ich einen hatte). Also habe ich diesen Hack gefunden,

var pNodes = htmlDoc.DocumentNode.SelectNodes("//p")
    .Where(node => Regex.Match(node.InnerText, "^=.+=$").Success);

Wenn es eine HtmlAgilityPack-Lösung gibt, würde ich es gerne hören!



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