2008-10-23 8 views
5

Na razie najlepszy sposób, że znalazłem się w stanie manipulować DOM z ciągu znaków, które zawierają HTML jest:Jak mogę manipulować DOM z ciągu HTML w C#?

WebBrowser webControl = new WebBrowser(); 
webControl.DocumentText = html; 
HtmlDocument doc = webControl.Document; 

Istnieją dwa problemy:

  1. Wymaga obiekt WebBrowser!
  2. To nie może być używane z wieloma wątkami; Potrzebuję czegoś, co działa na innym wątku (innym niż główny wątek).

Jakieś pomysły?

+0

http://msdn.microsoft.com /en-us/library/aa290341%28v=vs.71%29.aspx – ThunderGr

Odpowiedz

16

Zrobiłem wyszukiwanie w GooglePlex dla HTML i znalazłem Html Agility Pack Nie wiem, czy to do tego, czy nie, pobieram go teraz, aby spróbować.

+1

Html Agility Pack jest niesamowity –

+0

Ditto - Właściwie zamierzałem zarekomendować użycie HTML Tidy, aby uzyskać dokument w dobrej formie, a następnie przekształcić go w XmlDocument, ale być może można go pominąć przy pomocy pakietu Agility Pack HTML. Dobry towar. –

+0

Agility pack działa dobrze z HTML i wątkiem! Dostałem odpowiedź! Wszyscy! –

6

W zależności od tego, co staramy się robić (może można podać więcej szczegółów?) Oraz w zależności od tego, czy HTML jest dobrze wykształcona, można przekonwertować to do XmlDocument:

System.Xml.XmlDocument x = new System.Xml.XmlDocument(); 
x.LoadXml(html); // as long as html is well-formed, i.e. XHTML 

Następnie można łatwo manipulować, bez instancji WebBrowser. Jeśli chodzi o wątki, nie wiem wystarczająco dużo o implementacji XmlDocument, aby poznać odpowiedź na tę część.


Jeśli dokument nie jest w odpowiedniej formie, można użyć NTidy (.NET otoki dla HTML Tidy), aby dostać go w pierwszym kształcie; Musiałem zrobić to samo dla projektu raz i naprawdę nie było tak źle.

+0

Dokument może nie być dobrze sformatowany, dlatego narzędzie XmlDocument może nie działać, ale doceniam alternatywę. –

5

JasonBunting już to opublikował, ale to naprawdę działa, aby użyć otoki .net wokół HTML schludny i załadować go w XmlDocument.

Użyłem tej .net opakowanie przed:

http://www.codeproject.com/KB/cs/ZetaHtmlTidy.aspx

i wdrożono go trochę tak:

string input = "<p>crappy html<br <img src=foo></div>"; 
HtmlTidy tidy = new HtmlTidy() 
string output = tidy.CleanHtml(input, HtmlTidyOptions.ConvertToXhtml); 
XmlDocument doc = new XmlDocument(); 
doc.LoadXml(output); 

Przepraszam, jeśli uważa się za repost :)

1

Jest to stare pytanie. Teraz są:

Powiązane problemy