re: test () XPath a HtmlAgilityPack (ottieni tutti i tag p con regex corrispondente interno)




 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](http://msdn.microsoft.com/en-us/library/ms950806.aspx) . 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".
<p>la cosa principale che vorrei ricordare al momento è che se le tue pagine si basano su meta-tag, vorrai testare e monitorare regolarmente la loro accettazione. ad esempio, per strumenti per i webmaster di google, se si desidera verificare la proprietà tramite meta-tag, è necessario posizionarlo in un elemento "head" (esistono altri modi per verificare la proprietà, quindi generalmente non è un problema, ma se devi fare affidamento sulla verifica basata su metatag, quindi è qualcosa da tenere a mente). lo stesso può valere per altri meta-tag come il meta-tag "robot" per controllare l'indicizzazione delle tue pagine: poiché l'accettazione al di fuori di una sezione "head" può variare da motore di ricerca a motore di ricerca, è una cosa che consiglierei di monitorare regolarmente (o forse è solo più semplice usare una sezione "testa" tradizionale per il momento se è necessario essere assolutamente certi).</p><p>per il resto, come altri hanno già detto, non darei per scontato che al momento sarebbe trattato in modo speciale. queste cose sono ancora in evoluzione ... una volta che si sono stabilizzate e si è scoperto che trattarle in modo diverso migliora significativamente la capacità di comprendere il contenuto di una pagina, quindi potresti iniziare a vedere cambiamenti nella gestione di quegli elementi.</p> <p>con<em> inline </em>script come quello che hai citato, è improbabile che ci sia<em> much </em>difference; tuttavia, ogni volta che il parser html del browser incontra un tag <code>script</code>, questo:</p><ul> <li>arresta bruscamente</li> <li>crea una stringa del testo nel tag fino alla prima volta che vede la stringa <code>"&lt;/script&gt;"</code></li> <li>passa il testo all'interprete javascript, ascoltando l'output che l'interprete invia quando si esegue un <code>document.write</code></li> <li>aspetta che l'interprete finisca</li> <li>inserisce l'output accumulato ricevuto nel flusso di analisi</li> <li>continua la sua analisi</li> </ul><p>quindi aumentare il numero di volte che questa sequenza deve verificarsi può, in teoria, aumentare il tempo di caricamento della pagina. influisce anche sul grado in cui il parser può &quot;guardare avanti&quot; nel flusso di token, il che potrebbe renderlo meno efficiente.</p><p>tutto ciò sembra davvero drammatico, ma dovresti profilare una pagina reale nei vari browser che ti interessano per determinare se ha avuto un impatto reale.</p><p>quindi, in sintesi, combinale il più possibile. se non riesci a combinare ragionevolmente una coppia, non preoccuparti troppo fino a quando non vedi un problema del mondo reale.</p><p>quanto sopra è per script in linea. naturalmente, se si hanno diversi tag <code>script</code> che si riferiscono a una serie di file javascript esterni, si avrà anche il problema che ciascuno di questi file deve essere scaricato, e l'avvio di una richiesta http è una cosa costosa (comparativamente) e quindi è meglio , in grande stile, per combinarli in un unico file.</p><p>alcune altre cose da considerare:</p><ul> <li>avere molti tag <code>script</code> sparsi nel tuo codice html può rendere difficile la manutenzione dello script</li> <li>separare il tuo codice html e lo script in file separati ti aiuta a limitare il livello di accoppiamento, aiutando di nuovo la manutenzione</li> <li>mettendo lo script in un file separato, è possibile eseguire quel file tramite minifiers/compressors/packer, riducendo al minimo le dimensioni del codice e rimuovendo commenti, lasciandoti libero di commentare nel codice sorgente sapendo che quei commenti saranno privati</li> <li>mettere gli script in file esterni ti dà l'opportunità di mantenere le cose separate dalla funzionalità, e quindi combinarle in un unico file per la pagina (compresso/minificato/impacchettato) per una consegna efficiente al browser</li> </ul><p>di più:</p><ul> <li> <a href="http://developer.yahoo.com/performance/rules.html">le &quot;migliori pratiche per accelerare il tuo sito web&quot; di yui</a> </li> <li> <a href="http://code.google.com/speed/page-speed/docs/rules\_intro.html">&quot;best practice per le prestazioni web&quot; di google</a> </li> </ul> non si può fare in html, dovrai impararti il php come minimo (codice che io consiglio vivamente). <p>questo è un modo per eseguirlo come previsto:</p><p>il <code>view.raw.php</code> sarebbe qualcosa del genere:</p><pre><code>&lt;?php defined( '\_jexec' ) or die; class yourcomponentviewyourview extends jviewlegacy // or jview depends on j! version { public function display($tpl = 'raw') { parent::display($tpl); } } </code></pre><p>il file <code>default\_raw.php</code> nella cartella <code>tmpl</code> sarebbe simile al seguente:</p><pre><code>&lt;?php defined( '\_jexec' ) or die; $url = juri::base(); $ch = curl\_init($url); curl\_setopt($ch,curlopt\_returntransfer, true); curl\_setopt($ch,curlopt\_followlocation, true); $contents = curl\_exec($ch); curl\_close($ch); $dom = new domdocument(); libxml\_use\_internal\_errors(true); $dom-&gt;loadhtml($contents); libxml\_use\_internal\_errors(false); $xpath = new domxpath($dom); $head = $xpath-&gt;query('/html/head')-&gt;item(0); $head = $dom-&gt;savehtml($head); echo '&lt;html&gt;' . $head . '&lt;body&gt;blah blah&lt;/body&gt;&lt;/html&gt;' </code></pre> <p>non l'ho testato con redirect component ma non è possibile reindirizzare l'url con i parametri get poiché vengono passati in una variabile diversa in apache. quindi la tua fonte verrebbe ignorata.<br> dovresti scriverlo nel file .htaccess con impostazioni extra: (non testato)</p><pre><code>rewritecond %{query\_string} (^|&amp;)query=param(&amp;|$) [nc] rewritecond %{request\_uri} ^/menu [nc] rewriterule .* /destination [r=301,l] </code></pre><p>vedi per altri esempi:<br> <a href="https://wiki.apache.org/httpd/rewritequerystring">https://wiki.apache.org/httpd/rewritequerystring</a> <br> <a href="https://stackoverflow.com/questions/19165811/htaccess-rewrite-with-http-host-and-query-string">https://stackoverflow.com/questions/19165811/htaccess-rewrite-with-http-host-and-query-string</a> </p> prova su google <p>se hai xdocument è più facile usare linq-to-xml:</p><pre><code>var document = xdocument.load(filename); var name = document.descendants(xname.get("name", @"http://demo.com/2011/demo-schema")).first().value; </code></pre><p>se sei sicuro che xpath sia l'unica soluzione di cui hai bisogno:</p><pre><code>using system.xml.xpath; var document = xdocument.load(filename); var namespacemanager = new xmlnamespacemanager(new nametable()); namespacemanager.addnamespace("empty", "http://demo.com/2011/demo-schema"); var name = document.xpathselectelement("/empty:report/empty:reportinfo/empty:name", namespacemanager).value; </code></pre> <p>dipende dal documento .php in cui ti trovi - se ti trovi in ​​item.php, o nei file category-item.php, dovrebbe funzionare quanto segue.</p><p>nella parte superiore del documento, aggiungi questo codice:</p><pre><code>&lt;!-- call to prepare extra fields --&gt; &lt;?php $extrafields = array(); foreach($this-&gt;item-&gt;extra\_fields as $item) { $extrafields[$item-&gt;id] = $item-&gt;value; } ?&gt; </code></pre><p>quindi, ovunque tu voglia chiamare il valore del campo compilato, usa questo:</p><pre><code>&lt;?php if($extrafields[id\_number\_of\_field]!=''):?&gt; &lt;!-- if filled in, then call data --&gt; &lt;?php echo $extrafields[id\_number\_of\_field];?&gt; &lt;!-- actual data call --&gt; &lt;?php endif; ?&gt; </code></pre><p>tag.php funziona in modo leggermente diverso, così come i moduli k2.</p><p>tag.php - non è necessario il codice aggiuntivo in testa, quanto segue chiamerà i dati del campo.</p><pre><code>&lt;?php $extrafields = json\_decode($item-&gt;extra\_fields);?&gt; &lt;?php foreach($extrafields as $key=&gt;$value): ?&gt; &lt;?php if($extrafields[$key]-&gt;id == 'id\_number\_of\_field'&amp;&amp;$extrafields[$key]-&gt;value!=''): ?&gt; &lt;?php echo $extrafields[$key]-&gt;value; ?&gt;, &lt;?php endif; ?&gt; &lt;?php endforeach; ?&gt; </code></pre><p>ancora una volta, con module\_k2\_content, non è necessaria la prima chiamata di dati. ottieni i dati sul campo in questo modo:</p><pre><code>&lt;?php echo $item-&gt;extrafields-&gt;alias\_of\_field-&gt;value ;?&gt; </code></pre><p>spero che sia d'aiuto.</p> <p>il campo deve essere dichiarato <code>public</code> per una visibilità adeguata dal markup aspx. in ogni caso, puoi dichiarare una proprietà:</p><pre><code> private string clients; public string clients { get { return clients; } } </code></pre><p><strong> aggiornamento: </strong>può anche essere dichiarato come <code>protected</code>, come indicato nei commenti seguenti.</p><p>quindi, per chiamarlo sul lato aspx:</p><blockquote> <p>&lt;% = clienti%&gt;</p> </blockquote><p>si noti che questo non funzionerà se lo si posiziona su un attributo di tag del server. per esempio:</p><blockquote> <p>&lt;asp: label runat = &quot;server&quot; text = &quot;&lt;% = client%&gt;&quot; /&gt;</p> </blockquote><p>questo non è valido questo è:</p><blockquote> <p>&lt;div&gt; &lt;% = clienti%&gt; &lt;/ div&gt;</p> </blockquote> <p>hai due modi per farlo:</p><ul> <li><p>utilizzando javascript: </p> <p><code>&lt;tr onclick="document.location = 'links.html';"&gt;</code></p></li> <li><p>usando le ancore:</p> <p><code>&lt;tr&gt;&lt;td&gt;&lt;a href=""&gt;text&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=""&gt;text&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;</code></p></li> </ul><p>ho fatto il secondo lavoro usando:</p><pre><code>table tr td a { display:block; height:100%; width:100%; } </code></pre><p>per sbarazzarsi dello spazio morto tra le colonne:</p><pre><code>table tr td { padding-left: 0; padding-right: 0; } </code></pre><p>ecco una semplice demo del secondo esempio: <a href="http://jsfiddle.net/bf729/"><strong>demo</strong></a> </p>