Avatar billede 123maka Nybegynder
26. juni 2008 - 02:44 Der er 15 kommentarer og
1 løsning

HTML til SQL

Findes noget lignende til .net? Lidt ligesom denne klasse til php: http://www.phpclasses.org/browse/view/image/file/14202/name/htmlsql_syntax_example.png eller forklaring her: http://phpclasses.freelancer.gs/browse/package/3086.html

Det er fordi jeg har brug for lidt meget matching med meget HTML, så tror ikke regex er det bedste bud. Jeg tror der må være noget nemmere, har i nogle ideer?
Avatar billede 123maka Nybegynder
28. juni 2008 - 00:28 #1
Hm.. Fandt ud af at XPath nok var smartere :)

Men har lidt problemer, de forventer vist noget XML. Har følgende kode:

using System.Xml;
using System.Xml.XPath;

CookieContainer realSession = new CookieContainer();
            string login = getHTML("localhost/login.php", realSession, "login=hej&kode=test");
           
StringReader toXml = new StringReader(login);
            XPathDocument Doc = new XPathDocument(toXml);
            XPathNavigator navigator = Doc.CreateNavigator();
            XPathNodeIterator iterator = navigator.Select("/html/body/div[2]/div/div[2]/div/div[3]/div[3]/table/tbody/tr/td[3]");

Får en fejl som hedder
Avatar billede 123maka Nybegynder
28. juni 2008 - 00:31 #2
"System.Xml.XmlException was unhandled
  Message="'--' is an unexpected token. The expected token is '>'. Line 81, position 5."
  Source="System.Xml"
  LineNumber=81
  LinePosition=5"

Skal jeg parse det.. Eller hvordan?
Avatar billede arne_v Ekspert
29. juni 2008 - 04:26 #3
HTML er sjældent wellformed XML.
Avatar billede arne_v Ekspert
29. juni 2008 - 04:31 #4
Avatar billede aaberg Nybegynder
04. juli 2008 - 12:19 #5
Du kan bruge HtmlDocument som Arne v foreslår, men for at oprette en instans af denne klasse, bliver du nød til at gå via en WebBrowser. Dette giver ekstremt dårlig performance. Derudover kan en WebBrowser kun køre i en STAThread tråd (din hovedtråd), så du kan ikke bruge en BackgroundWorker tråd til at gøre arbejdet.

Jeg har for tiden samme problemstilling som dig med et projekt jeg arbejder med, og uanset hvad jeg har prøvet, har jeg ikke kunne få HtmlDocument til at virke ordentligt, uden at musen bliver et timeglas og brugergrænsesnittet hænger. For tiden eksperimenterer jeg med nogle metoder som bliver beskrevet i denne artikkel:
http://www.developer.com/net/csharp/article.php/10918_2230091_1

Når jeg har fået set lidt mere på det, eller hvis jeg finder noget endnu bedre, skal jeg vende tilbage. Men tjek artiklen, det kan være du kan bruge noget af det.
Avatar billede aaberg Nybegynder
04. juli 2008 - 12:38 #6
Følgende link er også vældig interessant:
http://www.codeplex.com/Wiki/View.aspx?ProjectName=htmlagilitypack

Jeg har desværre ikke haft tid til at teste det.
Avatar billede 123maka Nybegynder
07. juli 2008 - 01:24 #7
Ah.. Tak for links.. Troede i havde glemt mig :-)

Jeg er tilbage igen og arbejder videre. Umiddelbart kan man vist bruge Tidy.Net til at parse HTML til XML (Xhtml) det burde vi virke, sidder og bøvler en smule med det nu. Men colaen er ved at slippe op :-)

Melder tilbage :)
Avatar billede 123maka Nybegynder
09. juli 2008 - 04:39 #8
Jeg har imidlertid et problem. Jeg parser gennem Tidy på denne side:
<center><h2>Test 1</h2> Test 2</center>

Gennem tidy bliver den til:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title></title>
  </head>

  <body>
    <h2>Test 1</h2>
    Test 2<br />
  </body>
</html>
Avatar billede 123maka Nybegynder
09. juli 2008 - 04:44 #9
Umiddelbart ville jeg sige at xpathen til indholdet mellem <h2> og </h2> burde være "Test 1".

Kører jeg følgende kode igennem:
string login = this.parse2xml(getHTML("http://localhost"));
            Console.WriteLine(login);

            StringReader toXml = new StringReader(login);
            XPathDocument Doc = new XPathDocument(toXml);
            XPathNavigator navigator = Doc.CreateNavigator();
            XPathNodeIterator iterator = navigator.Select("/html/body/h2/");

Console.WriteLine(iterator.Current.Value);

Så bliver følgende printet ud:
Test 1\r\n
Test2

Hvorfor kommer Test 2 med?
Avatar billede aaberg Nybegynder
09. juli 2008 - 08:48 #10
Du har et default namespace i dit xml-document. Dette må tages med i XPath'en. Derudover skal du kalde iterator.MoveNext();

StringReader toXml = new StringReader(login);
XPathDocument Doc = new XPathDocument(toXml);
XPathNavigator navigator = Doc.CreateNavigator();
XmlNamespaceManager nsm = new XmlNamespaceManager(navigator.NameTable);
nsm.AddNamespace("x", "http://www.w3.org/1999/xhtml");
XPathNodeIterator iterator = navigator.Select("/x:html/x:body/x:h2");

while(iterator.MoveNext())
{
    Console.WriteLine(iterator.Current.Value);
}
Avatar billede 123maka Nybegynder
12. juli 2008 - 21:04 #11
Jeg får følgende fejl:
Namespace Manager or XsltContext needed. This query has a prefix, variable, or user-defined function.

På denne linje:
XPathNodeIterator iterator = navigator.Select("/x:html/x:body/x:h2");
Avatar billede aaberg Nybegynder
12. juli 2008 - 22:28 #12
Whoops. Jeg har skrevet lidt forkert. Du skal bruge en anden overload af Select metoden, hvor NameSpaceManageren kommer med som parameter.

XPathNodeIterator iterator = navigator.Select("/x:html/x:body/x:h2", nsm);
Avatar billede 123maka Nybegynder
13. juli 2008 - 01:22 #13
Super :)

Det virker nu. Tak for hjælpen, opretter du svar?
Avatar billede aaberg Nybegynder
13. juli 2008 - 08:12 #14
svar :-)
Avatar billede aaberg Nybegynder
22. juli 2008 - 13:21 #15
Så skal du huske at acceptere svaret :-)
Avatar billede 123maka Nybegynder
01. august 2008 - 21:49 #16
God ide, tak for hjælpen :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester