Dominik: Aufruf des validator.w3.org/check aus einem Programm heraus

Hallo,

ich schreibe einen Webserver in Java (ohne Servlets und JSP), der HTML-Code generiert und diesen zum Browser schickt. Da jede generierte Seite überprüft werden soll, ob sie XHTML-konform ist, wollte ich dazu den Validator unter http://validator.w3.ort/check nutzen. Da es sich bei dem zu prüfenden HTML-Code um keine vollständigen HTML-Seiten handelt, verpacke ich sie in einer minimalen XHTML-konformen Seite, die ich dann mittels POST an den Validator schicke (die Java-Methode steht am Ende dieses Posts). Laut der API-Beschreibung des Validators muss ich dazu den Parameter uploaded_file verwenden. Es steht dort jedoch nichts dazu, welchen Wert der Parameter haben soll.
Ich habe folgende Möglichkeiten probiert:
  http://validator.w3.org/check?uploaded_file
  http://validator.w3.org/check?uploaded_file=
  http://validator.w3.org/check?uploaded_file=1
  http://validator.w3.org/check?uploaded_file=test
  http://validator.w3.org/check?uploaded_file=Test.html
  http://validator.w3.org/check?uploaded_file='Test.html'
  http://validator.w3.org/check?uploaded_file="Test.html"
  (" habe ich im Java-Code als " geschrieben)
Jedoch erhielt ich immer folgende Fehlermeldung:
1. Error
   Sorry, this type of URL scheme ("undefined") is not supported by this
service. Please check that you entered the URL correctly.

Ich habe vergeblich im Internet nach einer Lösung gesucht, allerdings keine gefunden. Da ich bisher noch nie einen WebService aus einem Programm heraus aufgerufen habe, kann es sein, dass mir ein dummer Fehler unterlaufen ist. Weiß vielleicht jemand, was an meinem Code falsch ist? Ist vielleicht der Wert des Parameters in der URL falsch? Schon mal vielen Dank im Voraus.

/**
  * Checks if <code>html</code> is correct XHTML.
  *
  * @param html the HTML-code
  * @return true iff the online validator sends all ok
  */
private boolean checkXHTML(String html) {
  boolean isValid = false;
  // validator can only check complete HTML-sides
  String side = "<?xml version="1.0" encoding="UTF-8" ?>"
    + "<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">"
    + "<html xmlns="http://www.w3.org/1999/xhtml">"
    + "<head>"
    + "<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8" />"
    + "<meta http-equiv="Content-Script-Type"
content="text/javascript" />"
    + "<meta http-equiv="Content-Style-Type" content="text/css" />"
    + "<title></title>"
    + "</head>"
    + "<body>"
    + html //the HTML-code
    + "</body>" + "</html>";
  try {
    // create connection to the validator
    URL u = new URL("http://validator.w3.org/check?uploaded_file=test");
    HttpURLConnection httpCon = (HttpURLConnection) u.openConnection();
    httpCon.setDoOutput(true);
    //create boundary
    String boundary = "---------------------------";
    boundary+=Long.toString(new Random().nextLong(), 36);
    boundary+=Long.toString(new Random().nextLong(), 36);
    boundary+=Long.toString(new Random().nextLong(), 36);
    //set contentType and boundary
    httpCon.setRequestProperty("Content-Type",
      "multipart/form-data; boundary=" + boundary);
    //upload file
    OutputStream os = httpCon.getOutputStream();
    os.write(("--"+boundary+"\r\n").getBytes());
    os.write(("Content-Disposition: form-data; name="test"; "
      +"filename="Test.html"\r\n").getBytes());
    os.write(("Content-Type: text/html\r\n").getBytes());
    os.write(("\r\n").getBytes());
    os.write(side.getBytes());
    os.write(("\r\n").getBytes());
    os.write(("--"+boundary+"--\r\n").getBytes());
    os.flush();
    os.close();
    String header = httpCon.getHeaderField("X-W3C-Validator-Status").trim()
      .toLowerCase();
    // disconnect
    if (!header.equals("valid")) {
      // creates an file to see the error message
      writeReceived(httpCon.getInputStream(), httpCon);
    }
    httpCon.disconnect();
    System.out.println(header);
    isValid = header.equals("valid");
  } catch (MalformedURLException e) {
    e.printStackTrace();
  } catch (UnsupportedEncodingException e) {
    e.printStackTrace();
  } catch (IOException e) {
    e.printStackTrace();
  }
  return isValid;
}

  1. Tach,

    ich schreibe einen Webserver in Java (ohne Servlets und JSP), der HTML-Code generiert und diesen zum Browser schickt. Da jede generierte Seite überprüft werden soll, ob sie XHTML-konform ist, wollte ich dazu den Validator unter http://validator.w3.ort/check nutzen.

    javax.xml.validation.Validator ist ein Schema-Validator (einer unter vielen übrigens), damit musst du weder unnötigen Traffic beim W3 erzeugen, noch bist du davon abhängig dass der Dienst dort verfügbar ist.

    mfg
    Woodfighter

    1. Hi,

      javax.xml.validation.Validator ist ein Schema-Validator (einer unter vielen übrigens), damit musst du weder unnötigen Traffic beim W3 erzeugen, noch bist du davon abhängig dass der Dienst dort verfügbar ist.

      danke für den Tip. Ich lasse jetzt die Überprüfung lokal laufen :) .

      mfg
      Dominik