Axel Richter: Werte auslesen von html seite

Beitrag lesen

Hallo,

Was sind denn das für "Werte" und wo stehen die in der HTML-Seite?

Laborwerte. Diese stehen in einer Tabelle. Oben steht das Datum des eingetragenen Wertes, links in der Tabelle der Name. Mehr nicht.

Hm:

2003-11-17
Paul Müller     12.56
Kurt Maier       8.99
...
2003-11-18
Paul Müller      9.16
Kurt Maier      28.89
...

So?

Meine Aufgabe ist es diese grafisch umzusetzen.
Das heisst auf der Seite wo die Tabelle steht, sollen zu jeweiligen Wert Buttons hinzugefügt werden. Wenn man darauf klickt sollen die Werte des entsprechenden Datums grafisch angezeigt werden. (in SVG).

Diese Werte sollen später in einer SVG-Grafik umgesetzt werden.
Was heißt "später"? Auf dem Server?
Ja genau.

Die SVG Grafik steht. Hab diese in Java implementiert um diese mit Java dynamisch zu erzeugen.
Java oder Javascript? Woher nimmst Du denn im Augenblick die Werte hierfür?

Die Grafik ist in Java implementiert. Zum testen habe ich irgendwelche Werte direkt mit ner StringBuffer x-Methode übergeben. Diese werden dann mit nem Methodenaufruf, der im Servlet steht, aufgerufen.

So richtig habe ich das zwar immer noch nicht verstanden, aber es läuft wohl darauf hinaus, dass Du eine HTML-Tabelle auslesen willst. Das geht mit:
javax.swing.text.html.HTMLDocument
http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/text/html/HTMLDocument.html
und
javax.swing.text.html.HTMLEditorKit
http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/text/html/HTMLEditorKit.html

Beispiele:
http://javaalmanac.com/egs/javax.swing.text.html/GetText.html?l=rel
http://javaalmanac.com/egs/javax.swing.text.html/GetLinks.html?l=rel

Hier ein vom GetText-Beispiel leicht abgewandeltes Beispiel zum parsen von Tabellen:

import java.io.*;
import java.net.*;
import javax.swing.text.*;
import javax.swing.text.html.*;

public class parseHTMLTabellen {

// This method takes a URI which can be either a filename (e.g. file://c:/dir/file.html)
    // or a URL (e.g. http://host.com/page.html) and returns all text in the document.
    public static String getTabellenText(String uriStr) {
        final StringBuffer buf = new StringBuffer(1000);

try {
            // Create an HTML document that appends all text to buf
            HTMLDocument doc = new HTMLDocument() {
                public HTMLEditorKit.ParserCallback getReader(int pos) {
                    return new HTMLEditorKit.ParserCallback() {
                        HTML.Tag tg = null;

public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos) {
                            tg = t;
                            if (t == HTML.Tag.TABLE) buf.append("Neue Tabelle\n");
                        }

public void handleEndTag(HTML.Tag t, int pos) {
                            if (t == HTML.Tag.TR || t == HTML.Tag.TH) buf.append("\n");
                            if (t == HTML.Tag.TD) buf.append("\t");
                        }

// This method is whenever text is encountered in the HTML file
                        public void handleText(char[] data, int pos) {
                            if (tg == HTML.Tag.TD) buf.append(data);
                        }
                    };
                }
            };

// Create a reader on the HTML content
            URL url = new URL(uriStr);
            URLConnection conn = url.openConnection();
            Reader rd = new InputStreamReader(conn.getInputStream());

// Parse the HTML
            EditorKit kit = new HTMLEditorKit();
            kit.read(rd, doc, 0);
        } catch (MalformedURLException e) { System.out.println(e);
        } catch (BadLocationException e) { System.out.println(e);
        } catch (IOException e) { System.out.println(e);
        }

// Return the text
        return buf.toString();
    }

public static void main(String[] args) {
    String s = getTabellenText("file:///d:/www/test66.html");
    System.out.println(s);
  }
}

Du kannst natürlich auch vom GetLinks-Beispiel ausgehen und daraus ein GetTables-Beispiel machen, indem Du mehrere Iteratoren
HTMLDocument.Iterator it_tbl = doc.getIterator(HTML.Tag.TABLE);
HTMLDocument.Iterator it_tr = doc.getIterator(HTML.Tag.TR);
HTMLDocument.Iterator it_td = doc.getIterator(HTML.Tag.TD);
verschachtelst.

viele Grüße

Axel