Avatar billede mik28 Seniormester
08. juni 2009 - 17:50 Der er 26 kommentarer og
1 løsning

XPATH med HTTPClient

Hej Eksperter,

Jeg sidder og roder lidt med XPATH, men er kørt lidt fast. Det jeg gerne vil opnå er at bygge en klient på så jeg kan styre timeouts. Jeg er kommet hertil

<%@page import="org.w3c.dom.*,org.apache.xpath.*,javax.xml.parsers.*" %>
<%@page import="org.apache.commons.httpclient.*,org.apache.commons.httpclient.methods.*,org.apache.commons.httpclient.params.HttpMethodParams.*" %>

<html>
<head><title>Test XPATH</title></head>
<body>

<%
String url = "http://192.168.1.105:8080/testxpath/test.xml";

HttpClient client = new HttpClient();
GetMethod method = new GetMethod(url);
          method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
            new DefaultHttpMethodRetryHandler(3, false));
%>


<%
  try {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
   
    //Document trae = factory.newDocumentBuilder().parse("http://192.168.1.105:8080/testxpath/test.xml");
    Document trae = factory.newDocumentBuilder().parse(method);

    // Lav liste af resultater fra XPath-udtrykket
    NodeList fornavn = XPathAPI.selectNodeList(trae, "//galleri/person/fornavn/text()");
    NodeList efternavn = XPathAPI.selectNodeList(trae, "//galleri/person/efternavn/text()");

    %>
    Antal fornavne <%= fornavn.getLength() %><br />
   
    <%
    //Gennemløb listen og udskriv
    for (int i = 0; i < fornavn.getLength(); i++) {
      out.print(fornavn.item(i).getNodeValue()+"<br>");
     
      try{
      out.print(efternavn.item(i).getNodeValue()+"<br>");
      }
      catch(Exception e){}
    }

  } catch (Exception e) {
    e.printStackTrace();
    out.print("<p>Der opstod et problem: "+e+"</p>");
  }
%>
</body>
</html>

Det virker fint uden klienten.
Jeg får denne fejl:
HttpClient cannot be resolved to a type

Jeg har lagt httpcore-4.0.jar og httpcore-nio-4.0.jar i WEB-INF\lib i min app
Avatar billede mik28 Seniormester
08. juni 2009 - 20:14 #1
Jeg håber virkelig der er en som kan hjælpe mig her

<%
String url = "http://192.168.1.105:8080/testxpath/test.xml";

HttpClient client = new HttpClient();

GetMethod method = new GetMethod(url);

//          method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
//          new DefaultHttpMethodRetryHandler(3, false));
%>


<%
  try {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
   
        Document trae = factory.newDocumentBuilder().parse(method);
Avatar billede mik28 Seniormester
08. juni 2009 - 20:19 #2
Jeg får ikke den samme fejl mere efter jeg har smidt commons-httpclient-3.1.jar ind :-)

Det jeg supergerne vil finde ud af er hvordan jeg får bygget clienten på og får sat timeouts samt antal forsøg. Det skulle gerne blive noget ala

<%
String url = "http://192.168.1.105:8080/testxpath/test.xml";

HttpClient client = new HttpClient();
GetMethod method = new GetMethod(url);

//          method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
//          new DefaultHttpMethodRetryHandler(3, false));
%>

Document trae = factory.newDocumentBuilder().parse(method);
Avatar billede mik28 Seniormester
09. juni 2009 - 11:21 #3
Hvad er det jeg gør forkert?

<%
String url = "http://192.168.1.105:8080/testxpath/test.xml";

HttpClient client = new HttpClient();
          client.getHttpConnectionManager().getParams().setConnectionTimeout(30000);

GetMethod method = new GetMethod(url);
String ss = method.getURI()+"";
%>


<%
  try {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
   
    //Document trae = factory.newDocumentBuilder().parse("http://192.168.1.105:8080/testxpath/test.xml");
    Document trae = factory.newDocumentBuilder().parse(ss);
Avatar billede arne_v Ekspert
10. juni 2009 - 03:54 #4
Hvilken fejl for du på ovenstående kode?

Hvis jeg skal gætte så har du problemed med URL på XML versus XML selv.

Prøv at erstatte:

Document trae = factory.newDocumentBuilder().parse(ss);

med:

Document trae = factory.newDocumentBuilder().parse(new InputSource(new StringReader(ss)));
Avatar billede mik28 Seniormester
10. juni 2009 - 08:33 #5
Jeg får sådan set ikke nogen fejl. Det "virker". Det jeg ikke forstår er hvordan jeg får clienten ind i billedet så jeg kan styre timeouts. http://web-oasen.dk/testxpath
Avatar billede mik28 Seniormester
10. juni 2009 - 08:37 #6
Jeg vil gerne have at det kikser hvis jeg skriver

client.getHttpConnectionManager().getParams().setConnectionTimeout(0);

så jeg kan se det virker
Avatar billede arne_v Ekspert
11. juni 2009 - 01:43 #7
String ss = method.getURI()+"";

->

client.executeMethod(met);
String ss = met.getResponseBodyAsString();

og så:

Document trae = factory.newDocumentBuilder().parse(new InputSource(new StringReader(ss)));
Avatar billede mik28 Seniormester
11. juni 2009 - 08:29 #8
Hmmm. Jeg kan altså ikke få det til ikke at virke :-)


<%@page import="org.w3c.dom.*,org.apache.xpath.*,javax.xml.parsers.*" %>
<%@page import="org.apache.commons.httpclient.*,org.apache.commons.httpclient.methods.*,org.apache.commons.httpclient.params.HttpMethodParams.*" %>
<%@page import="org.xml.sax.InputSource.*" %>

<html>
<head><title>Test XPATH</title></head>
<body>

<%
String url = "http://192.168.1.103/testxpath/test.xml";

HttpClient client = new HttpClient();
          client.getHttpConnectionManager().getParams().setConnectionTimeout(0);

GetMethod method = new GetMethod(url);
client.executeMethod(method);
String ss = method.getResponseBodyAsString();

%>


<%
  try {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
   
    Document trae = factory.newDocumentBuilder().parse(new InputSource(new StringReader(ss)));
Avatar billede arne_v Ekspert
11. juni 2009 - 15:26 #9
Og hvad er fejlen?
Avatar billede mik28 Seniormester
11. juni 2009 - 18:30 #10
Avatar billede mik28 Seniormester
11. juni 2009 - 19:19 #11
Mangler jeg noget her? Er der noget som jeg ikke skal have?

<%@page import="org.w3c.dom.*,org.apache.xpath.*,javax.xml.parsers.*" %>
<%@page import="org.apache.commons.httpclient.*,org.apache.commons.httpclient.methods.*,org.apache.commons.httpclient.params.HttpMethodParams.*" %>
<%@page import="org.xml.sax.InputSource.*,java.io.Reader.*" %>
Avatar billede mik28 Seniormester
11. juni 2009 - 19:30 #12
Jeg forstår det altså ikke helt. Jeg har lavet min import om til

<%@page import="org.xml.sax.InputSource,java.io.*" %>

og det virker, men jeg har stadig

client.getHttpConnectionManager().getParams().setConnectionTimeout(0);

og det virker stadig. Hvorfor timer det ikke ud? Skal jeg ikke have

client.executeMethod(method); i en try catch?
Avatar billede mik28 Seniormester
11. juni 2009 - 19:46 #13
er det rigtigt forstået at hvis jeg skriver

  client.getHttpConnectionManager().getParams().setConnectionTimeout(1);
          client.getHttpConnectionManager().getParams().setSoTimeout(1);

Så er den første timeout tiden der må gå før der skal være en svar og den anden "time to last byte" ?
Avatar billede mik28 Seniormester
11. juni 2009 - 22:02 #14
Det skal vel se nogenlunde således ud. Det irriterer mig bare at det ikke timer ud

<%
String url = "http://192.168.1.103/testxpath/test.xml";

HttpClient client = new HttpClient();
          client.getHttpConnectionManager().getParams().setConnectionTimeout(1);
          client.getHttpConnectionManager().getParams().setSoTimeout(1);
         

GetMethod method = new GetMethod(url);
try{
client.executeMethod(method);
}
catch (Exception e){}
String ss = method.getResponseBodyAsString();
%>


<%
  try {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    Document trae = factory.newDocumentBuilder().parse(new InputSource(new StringReader(ss)));
Avatar billede mik28 Seniormester
11. juni 2009 - 22:03 #15
Det ville være fedt hvis du viste mig hvordan du ville løse det
Avatar billede arne_v Ekspert
12. juni 2009 - 20:54 #16
Ja.

Timer den ikke ud?
Avatar billede mik28 Seniormester
12. juni 2009 - 21:19 #17
Nej, men det kan jo være at den faktisk kan svare på et millisekund. Det er jo bare en statisk xml fil. Jeg har prøvet http://web-oasen.dk/testxpath/rss.jsp og sat urimmelige timeouts på. Jeg får en nullpointerexception
Avatar billede mik28 Seniormester
12. juni 2009 - 21:22 #18
det jeg er mest interesseret i er om jeg gør det rigtigt. Hvordan kan jeg se hvilke Exceptions som kan blive kastet?
Avatar billede arne_v Ekspert
13. juni 2009 - 03:36 #19
Du skal nok kun fortsætte hvis du ikke få en Exception.
Avatar billede mik28 Seniormester
14. juni 2009 - 20:51 #20
jeg får kun en nullpointerexception. Anyway ligger du et svar?
Avatar billede arne_v Ekspert
15. juni 2009 - 21:26 #21
Der er noget galt med din kode. Jeg tror at du har 2 forskellige ss variable.

Noget a la:

<%
String url = "http://192.168.1.103/testxpath/test.xml";
HttpClient client = new HttpClient();
client.getHttpConnectionManager().getParams().setConnectionTimeout(1);
client.getHttpConnectionManager().getParams().setSoTimeout(1);
GetMethod method = new GetMethod(url);
try {
    client.executeMethod(method);
    String ss = method.getResponseBodyAsString();
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    Document trae = factory.newDocumentBuilder().parse(new InputSource(new StringReader(ss)));
    // udskriv noget fra XML
} catch (Exception e){
    // udskriv fejl besked
}
%>


<%
  try {
Avatar billede arne_v Ekspert
15. juni 2009 - 21:26 #22
(og saa fik jeg ikke slettet de sidste snask)
Avatar billede arne_v Ekspert
15. juni 2009 - 21:26 #23
Og et svar.
Avatar billede mik28 Seniormester
15. juni 2009 - 21:40 #24
Min kode ser således ud:

<%
String url = "URL";

HttpClient client = new HttpClient();
          client.getHttpConnectionManager().getParams().setConnectionTimeout(2000);
          client.getHttpConnectionManager().getParams().setSoTimeout(3000);
         

GetMethod method = new GetMethod(url);
try{
client.executeMethod(method);
}
catch (Exception e){}
String ss = method.getResponseBodyAsString();
%>


<%
  try {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    Document trae = factory.newDocumentBuilder().parse(new InputSource(new StringReader(ss)));

    // Lav liste af resultater fra XPath-udtrykket
    NodeList tekst = XPathAPI.selectNodeList(trae, "//item/title/text()");
    NodeList link  = XPathAPI.selectNodeList(trae, "//item/link/text()");
    %>
    Antal items <%= tekst.getLength() %><br />
   
    <%
    //Gennemløb listen og udskriv
    for (int i = 0; i < tekst.getLength(); i++) {
     
      try{
      out.print(tekst.item(i).getNodeValue()+"  ");
      }
      catch(Exception e){}
     
      try{
      out.print("<a href='"+link.item(i).getNodeValue()+"'>link</a>");
      }
      catch(Exception e){}
    }

  } catch (Exception e) {
    e.printStackTrace();
    out.print("<p>Der opstod et problem: "+e+"</p>");
  }
%>
Avatar billede mik28 Seniormester
15. juni 2009 - 21:41 #25
Kan jeg ligge client.executeMethod(method); ned i den anden try catch?
Avatar billede arne_v Ekspert
15. juni 2009 - 21:50 #26
client.executeMethod(method);
String ss = method.getResponseBodyAsString();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
Document trae = factory.newDocumentBuilder().parse(new InputSource(new StringReader(ss)));

maa skulle ligge is amme blok (som i #21).
Avatar billede mik28 Seniormester
15. juni 2009 - 21:51 #27
okay. 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
Kurser inden for grundlæggende programmering

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