2009-10-16 7 views
62

Mi chiedo se esiste un selettore di css simile a jQuery che può essere utilizzato in C#.Esiste un selettore CSS/HTML simile a jQuery che può essere utilizzato in C#?

Attualmente sto analizzando alcune stringhe html usando espressioni regolari e ho pensato che sarebbe stato molto più bello avere qualcosa come il selettore CSS in jQuery per abbinare i miei elementi desiderati.

+0

Quindi, credo che non c'è al momento nulla di tutto questo – Dave

+0

Come funziona XPath non l'interrogazione soddisfare le vostre esigenze catena di carico in oggetto DOM con? Parser XML o HTML e query per elementi basati su qualsiasi cosa tu voglia. Proprio come jQuery. – patjbs

+0

Se desideri una struttura di query di grep più semplice, hai provato ad usare le query di linq? – patjbs

risposta

69

Si dovrebbe vedere @ di CsQuery jamietre. Dai un'occhiata alla sua risposta a questa domanda!

Fizzler e Sharp-Query forniscono funzionalità simili, ma i progetti sembrano essere abbandonati.

+0

Juste a note: la query Sharp è GPL. Fizzler è LGPL, più business friendly. – nakhli

+0

Sembra che Fizzler sia beta per 2 anni, nessuna attività. Sharp-Query non molto meglio, lo stato non è chiaro. –

+5

Si prega di considerare l'upvoting @ la risposta di jamietre invece della mia. Ha una soluzione fantastica! –

2

Per XML è possibile utilizzare XPath ...

+0

Oh sì, ho dimenticato di dirlo. come il selettore di CSS per la sua semplicità e chiarezza – Dave

+3

Scopri HTML Agility Pack se vuoi usare XPath con potenzialmente non bene -formato HTML. http://htmlagilitypack.codeplex.com/ –

+0

Successivamente ho iniziato a utilizzare CsQuery e ora lo preferisco. –

1

io non sono del tutto chiare su ciò che si sta cercando di raggiungere, ma se si dispone di un documento HTML che si sta cercando di estrarre i dati da, Suggerirei di caricarlo con uno parser, e quindi diventa abbastanza banale interrogare l'oggetto per estrarre gli elementi desiderati.

Il parser che ho collegato sopra consente l'uso di query XPath, che suona come quello che stai cercando.

Fammi sapere se ho frainteso.

+0

Posso sapere a quale parser si sta riferendo? Voglio solo qualcosa come Doc.select ("div.foo") per restituire tutti gli elementi che sono div e avere classe foo. – Dave

+0

Ho aggiunto un collegamento al testo, che rimanda a una domanda SO sull'analisi dell'HTML. In particolare, il parser di HTML Agility Pack che ho usato in passato per caricare documenti HTML e interrogarli con successo. – patjbs

1

Non proprio jQuery come, ma questo può aiutare: http://www.codeplex.com/htmlagilitypack

+1

sì ... ho appena controllato il pacchetto di agilità html pochi giorni fa. Ma usa ancora XPath per la corrispondenza. Non è che non mi piace XPath. Ma la pulizia della sintassi del selettore css è molto meglio. – Dave

+0

LINQ-to-Objects è probabilmente quello che userei. Ma giusto, non pulito come i selettori. – Daniel

78

Aggiornamento 10/18/2012

CsQuery è ora in versione 1.3. L'ultima versione include una porta C# del parser HTML5 validator.nu. Di conseguenza, CsQuery produrrà un DOM che utilizza le specifiche HTML5 per la gestione del markup non valida ed è completamente conforme agli standard.

vecchia questione, ma nuova risposta risposta originale. Recentemente ho rilasciato la versione 1.1 di CsQuery, una porta jQuery per .NET 4 scritta in C# su cui ho lavorato per circa un anno. Sempre su NuGet come "CsQuery"

La versione corrente implementa tutti i selettori CSS3 & CSS3, tutte le estensioni jQuery e tutti i metodi di manipolazione DOM jQuery. Ha una vasta copertura di test che include tutti i test di jQuery e sizzle (il motore di selezione CSS di jQuery). Ho anche incluso alcuni test delle prestazioni per confronti diretti con Fizzler; per la maggior parte CsQuery lo supera in modo drammatico. L'eccezione è in realtà il caricamento dell'HTML in primo luogo dove Fizzler è più veloce; Presumo che questo sia dovuto al fatto che fizzler non crea un indice. Si ottiene quel tempo indietro dopo la prima selezione, però.

C'è documentazione sul sito GitHub, ma ad un livello di base funziona in questo modo:

Creare da una stringa di codice HTML

CQ dom = CQ.Create(htmlString); 

carico in modo sincrono dal web

CQ dom = CQ.CreateFromUrl("http://www.jquery.com"); 

Carica in modo asincrono (non bloccante)

CQ.CreateFromUrlAsync("http://www.jquery.com", responseSuccess => { 
    Dom = response.Dom;   
}, responseFail => { 
    .. 
}); 

Run selettori & fanno jQuery roba

var childSpans = dom["div > span"]; 
childSpans.AddClass("myclass"); 

l'oggetto CQ è come oggetto thejQuery. L'indicizzatore proprietà utilizzata sopra è il metodo di default (come $(...)

uscita:.

string html = dom.Render(); 
+0

Gestisci i casi in cui sono presenti nuove righe, interruzioni di riga e tabulazioni come spazi bianchi che separano i nomi delle classi? – casperOne

+0

Appena aggiunto un test per questo, già interpreta correttamente gli spazi bianchi nelle classi come separatore. Quindi la risposta è sì. –

+0

Grazie per le informazioni. Sfortunatamente la domanda è NC, ma mi sono imbattuto in questo specifico numero un numero di volte. – casperOne

Problemi correlati