Voglio tutti i <p>=.+=</p>
. Il Regex funziona da solo, senza i tag <p>
.
Ecco il mio XPath: "//p[re:test(.,'^=.+=$', 'i')]"
Ma ricevo un'eccezione quando la inserisco,
HtmlNodeCollection pNodes = htmlDoc.DocumentNode.SelectNodes("//p[re:test(.,'^=.+=$', 'i')]");
L'eccezione è:
Namespace Manager o XsltContext necessari. Questa query ha un prefisso, una variabile o una funzione definita dall'utente.
Modifica: l'Html è generato da FCKEditor e non ha uno spazio dei nomi definito. Devo impostare qualcosa affinché funzioni?
L'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>
L'errore che si ha è dovuto al fatto che l'espressione re:test
utilizza una funzione XPATH denominata test
(dichiarata in uno spazio dei nomi il cui prefisso è re
), che è sconosciuto al contesto XSLT.
Non so da dove hai preso quell'espressione, ma non è standard, quindi non significa nulla nel contesto Html Agility Pack :-)
Per spiegazioni approfondite, consulta questo interessante articolo qui: Aggiunta di funzioni personalizzate a XPath . Nota che potresti farlo funzionare usando queste tecniche.
Detto questo, ecco un "Html Agility Pack / XPATH" puro:
var pNodes = htmlDoc.DocumentNode.SelectNodes("//p[text()='=.+=']");
Usa un filtro (tra [e]) e il testo della funzione XPATH standard () che significa "testo interno".
Apparentemente HtmlAgilityPack non gestisce gli spazi dei nomi (non che ne avessi uno). Quindi sono venuto con questo trucco,
var pNodes = htmlDoc.DocumentNode.SelectNodes("//p")
.Where(node => Regex.Match(node.InnerText, "^=.+=$").Success);
Se c'è una soluzione HtmlAgilityPack mi piacerebbe sentirla!