2009-10-16 12 views
62

Zastanawiam się, czy istnieje jQuery-jak selektor css, który może być użyty w C#.Czy istnieje selektor CSS/HTML podobny do jQuery, który może być użyty w języku C#?

Obecnie parsuję niektóre ciągi html za pomocą regex i pomyślałem, że byłoby o wiele ładniej mieć coś takiego, jak selektor css w jQuery, aby pasowało do moich pożądanych elementów.

+0

Tak, myślę, że nie ma obecnie nic takiego – Dave

+0

Jak XPath nie odpytywanie swoich potrzeb ciąg załadować do obiektu DOM z? Analizator składni XML lub HTML i zapytanie o elementy oparte na tym, co lubisz. Tak jak jQuery: – patjbs

+0

Jeśli potrzebujesz łatwiejszej struktury zapytań, czy próbowałeś użyć zapytań linq? – patjbs

Odpowiedz

69

powinno się zobaczyć @ jamietre na CsQuery. Sprawdź swoją odpowiedź na to pytanie!

Fizzler i Sharp-Query zapewniają podobną funkcjonalność, ale projekty wydają się być porzucone.

+0

Juste a note: Ostre zapytanie to GPL. Fizzler to LGPL, bardziej przyjazny dla biznesu. – nakhli

+0

Wygląda na to, że Fizzler jest w wersji beta przez 2 lata, bez żadnej aktywności. Sharp-Query niewiele lepiej, status niejasny. –

+5

Proszę rozważyć odpowiedź upvoting @ jamietre zamiast mojej. Ma fantastyczne rozwiązanie! –

2

XML można użyć XPath ...

+0

A tak, zapomniałem o tym wspomnieć. jak selektor css dla jego prostoty i jasności – Dave

+3

Sprawdź HTML Agility Pack, jeśli chcesz używać XPath z potencjalnie nie-dobrze -formowany HTML. http://htmlagilitypack.codeplex.com/ –

+0

Później zacząłem używać CsQuery, a teraz wolę. –

1

Nie jestem do końca jasne, co starasz się osiągnąć, ale jeśli masz dokument HTML, który próbujesz wydobyć dane z, Zaleciłbym załadowanie go za pomocą parser, a następnie staje się dość trywialne, aby zapytać obiekt, aby wyciągnąć pożądane elementy.

Analizator składający się z powyższego łącza pozwala na użycie zapytań XPath, które brzmią jak to, czego szukasz.

Daj mi znać, jeśli źle zrozumiałem.

+0

Czy mogę wiedzieć, do którego parsera się odwołujesz? Po prostu chcę czegoś takiego jak Doc.select ("div.foo"), aby zwrócić wszystkie elementy, które są div i mają klasę foo. – Dave

+0

Dodałem łącze do tekstu, które wskazuje na pytanie SO o parsowaniu HTML. W szczególności, parser pakietów Agility HTML użyłem w przeszłości do załadowania dokumentów HTML i wysłania do nich zapytań z wielkim sukcesem. – patjbs

1

Niezupełnie jak jQuery, ale może to pomóc: http://www.codeplex.com/htmlagilitypack

+1

tak ... Właśnie obejrzałam pakiet agility html kilka dni temu. Ale nadal używa XPath do dopasowywania. Nie chodzi o to, że nie lubię XPath. Ale czystość składni selektora css jest o wiele lepsza. – Dave

+0

LINQ-to-Objects jest prawdopodobnie tym, czego bym użył. Ale prawda - nie tak czysta jak selektory. – Daniel

78

Aktualizacja 10/18/2012

CsQuery jest teraz w wydaniu 1.3. Najnowsza wersja zawiera port C# analizatora składni HTML5 validator.nu. W wyniku tego CsQuery będzie teraz produkować DOM, który używa specyfikacji HTML5 do nieprawidłowej obsługi znaczników i jest całkowicie zgodny ze standardami.

Original Odpowiedź

Stare pytanie, ale nowa odpowiedź. Niedawno wydałem wersję 1.1 CsQuery, port jQuery dla .NET 4 napisany w C#, nad którym pracuję od około roku. Również na NuGet jako „CsQuery”

Obecne wydanie realizuje wszystkie CSS2 & CSS3 selektorów jQuery, wszystkie rozszerzenia, a wszystkie metody manipulacji jQuery DOM. Ma szeroki zakres testów obejmujący wszystkie testy z jQuery i skwierczenie (mechanizm selekcji jQuery CSS). Dodałem także testy wydajności do bezpośrednich porównań z Fizzler; w przeważającej części CsQuery dramatycznie go wyprzedza. Wyjątkiem jest ładowanie kodu HTML w pierwszej kolejności, gdzie Fizzler jest szybszy; Zakładam, że to dlatego, że fizzler nie tworzy indeksu. Otrzymasz ten czas po pierwszej selekcji.

Jest dokumentacja na stronie github, ale na poziomie podstawowym to działa tak:

Tworzenie z ciągu HTML

CQ dom = CQ.Create(htmlString); 

obciążenia synchronicznie z sieci

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

Ładuj asynchronicznie (bez blokowania)

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

Run selektorów jQuery & robić rzeczy

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

przedmiotem CQ jest jak przedmiot thejQuery. Indexer nieruchomość używana powyżej jest domyślną metodą (jak $(...)

wyjściowa:.

string html = dom.Render(); 
+0

Czy obsługujesz przypadki, w których występują nowe linie, podziały linii i tabulatory jako białe znaki oddzielające nazwy klas? – casperOne

+0

Po prostu dodano do tego test, który poprawnie interpretuje wszystkie spacje w klasach jako separatory. Tak więc odpowiedź brzmi "tak". –

+0

Dzięki za informacje. Pytanie jest niestety NC, ale kilka razy natknąłem się na ten konkretny problem. – casperOne

Powiązane problemy