PDA

View Full Version : [java-html] da nodo ad html


gaglioppo
11-03-2006, 17:44
ciao amici,

ho un albero DOM contenente una pagina html, mi servirebbe, a partire da un nodo visualizzare in un pannello il ramo scelto, così come si visualizzarebbe su un browser.


grazie

gaglioppo
13-03-2006, 08:24
up

sottovento
13-03-2006, 09:05
Ciao,
hai provato con JEditorPane? Dovrebbe fare al caso tuo.

High Flying
Sottovento

gaglioppo
13-03-2006, 10:12
con JEditorPane è semplice, ci passo la pagina html
facendo:
jpannello.setPage("pagina.html")

e mi visualizza la pagina

Il mio problema è che ho un albero DOM, in cui ogni nodo è un tag.
Al limite la mia idea sarebbe quella di:

- parsare la pagina html e creare l'albero
- scorrere la lista dei nodi e man mano creare delle stringhe con l'html relativo
- poi passare queste stringhe una ad una al jeditorpane (sempre se si puà fare senza mettere la stringa in un file) e visualizzare l'elemento

La ciliegina sulla torna sarebbe quella di definire per alcuni tag particolari (ad esempio tutte le immagini) un listener per il click del mouse.
L'utente clicca sull'immagine del browser cosi' fatto e si apre una schermata in cui posso eseguire delle operazioni.

La cosa mi pare complessa, ma pian piano potrei riuscirci

grazie e a presto

p.s. devo essere piu' dettagliato?

sottovento
13-03-2006, 10:43
con JEditorPane è semplice, ci passo la pagina html
facendo:
jpannello.setPage("pagina.html")

e mi visualizza la pagina

Il mio problema è che ho un albero DOM, in cui ogni nodo è un tag.
Al limite la mia idea sarebbe quella di:

- parsare la pagina html e creare l'albero
- scorrere la lista dei nodi e man mano creare delle stringhe con l'html relativo
- poi passare queste stringhe una ad una al jeditorpane (sempre se si puà fare senza mettere la stringa in un file) e visualizzare l'elemento

La ciliegina sulla torna sarebbe quella di definire per alcuni tag particolari (ad esempio tutte le immagini) un listener per il click del mouse.
L'utente clicca sull'immagine del browser cosi' fatto e si apre una schermata in cui posso eseguire delle operazioni.

La cosa mi pare complessa, ma pian piano potrei riuscirci

grazie e a presto

p.s. devo essere piu' dettagliato?

No, sei stato sufficientemente dettagliato, e c'e' da dire che hai le idee piuttosto chiare. A questo punto mi sembra che ce la possa fare tranquillamente, no?

Analizzando i punti che hai descritto:
- parsare la pagina html e creare l'albero: hai l'albero DOM (era la parte piu' difficile da fare), quindi l'hai risolto. A proposito, c'e' gia' qualcosa in libreria che lo fa?

- scorrere la lista dei nodi e man mano creare delle stringhe con l'html relativo. Si tratta di una visita in preordine. Potresti sfruttare il metodo toString() in modo che ognuno ritorni il suo pezzo html. Dovrebbe essere semplice e fattibile in poco tempo;

- poi passare queste stringhe una ad una al jeditorpane (sempre se si puà fare senza mettere la stringa in un file) e visualizzare l'elemento. Si puo' fare senza mettere la stringa in un file. Comunque non sei obbligato ad usare il jeditorpane: se il tuo problema e' solo la visualizzazione, qualsiasi oggetto Swing e' in grado di farlo.
Per esempio:

JLabel lbl = new JLabel ("<html><body><font color=red>Hello, world</font></body></html>");

crea una JLabel con la scritta "Hello, world" in rosso, determinata dai tag html.

Ricordati che se vuoi visualizzare solo dei pezzi, questo non vale: devi prendere il pezzo che vuoi visualizzare e racchiuderlo nei tag <html>...</html> (non sono sicuro che anche <body>...</body> sia necessario)

High Flying
Sottovento

gaglioppo
13-03-2006, 14:18
procediamo con ordine:

1. per prendere una pagina html e scaricarla in un albero dom uso NekoHtml (c'è pure JTidy). In pratica basta creare un parser e scaricargli la pagina:
Fa tutto lui, tu devi solo scorrere i nodi (Node) con un while.
(se ti serve ti posso mandare il link della libreria o i miei files)

2. Dalla classe Node riesco ad ottenere tutte le informazioni relative ad ogni tag html. Ad esempio, se ho un tag INPUT, posso interrogare il nodo ed ottenere tutti gli attributi, da un tag di questo tipo:
<INPUT type="text" name="pippo" value="giorgio" personale="ciccillo">
posso ricevere in una stringa tutti i singoli campi.

3. Il problema è ricevere l'html di quel nodo, sempre se sia possibile fare, e forse nn lo è. Mi viene da pensare questo:
Se considero il nodo <table .... > questo contiene tutti gli attributi (anche nessuno), ma contiene solo il riferimento ai vari tag <tr> che a loro volta contengono i riferimenti ai tag <td> che a loro volta possono contenere qualsiasi altro tag.

4. Secondo me dovrei, per ogni nodo, catturare l'html. Esempio: da un nodo table dorei ottenere la Stringa:

String a="<TABLE ALIGN="left" BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%">";

e quindi scandire tutti i nodi.
Devo trovare qualche cosa che mi aiuti a costruirli. Ci penso.

5. Se risolvo a risolvere ciò che ho detto nel punto 4 ed è vero che con jLabel posso visualizzare porzioni di html (ora verifico per bene), non mi resta che creare il listener che mi consenta di cliccare sull'elemento scelto. Ad esempio, se clicco sull'elemento <IMG....> si potrebbe aprire una finestra di popup che mi restituisca il percorso ed il nome dell'immagine.
(sui listener sono ancora scarso, pensi sia difficile realizzarne uno che faccia questo? come?)

sottovento
13-03-2006, 14:52
procediamo con ordine:

1. per prendere una pagina html e scaricarla in un albero dom uso NekoHtml (c'è pure JTidy). In pratica basta creare un parser e scaricargli la pagina:
Fa tutto lui, tu devi solo scorrere i nodi (Node) con un while.
(se ti serve ti posso mandare il link della libreria o i miei files)

2. Dalla classe Node riesco ad ottenere tutte le informazioni relative ad ogni tag html. Ad esempio, se ho un tag INPUT, posso interrogare il nodo ed ottenere tutti gli attributi, da un tag di questo tipo:
<INPUT type="text" name="pippo" value="giorgio" personale="ciccillo">
posso ricevere in una stringa tutti i singoli campi.

3. Il problema è ricevere l'html di quel nodo, sempre se sia possibile fare, e forse nn lo è. Mi viene da pensare questo:
Se considero il nodo <table .... > questo contiene tutti gli attributi (anche nessuno), ma contiene solo il riferimento ai vari tag <tr> che a loro volta contengono i riferimenti ai tag <td> che a loro volta possono contenere qualsiasi altro tag.

4. Secondo me dovrei, per ogni nodo, catturare l'html. Esempio: da un nodo table dorei ottenere la Stringa:

String a="<TABLE ALIGN="left" BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%">";

e quindi scandire tutti i nodi.
Devo trovare qualche cosa che mi aiuti a costruirli. Ci penso.

5. Se risolvo a risolvere ciò che ho detto nel punto 4 ed è vero che con jLabel posso visualizzare porzioni di html (ora verifico per bene), non mi resta che creare il listener che mi consenta di cliccare sull'elemento scelto. Ad esempio, se clicco sull'elemento <IMG....> si potrebbe aprire una finestra di popup che mi restituisca il percorso ed il nome dell'immagine.
(sui listener sono ancora scarso, pensi sia difficile realizzarne uno che faccia questo? come?)

Ciao,
1 - Non conoscevo affatto quella libreria. E' davvero molto bella! Se puoi pubblicare il link, penso che faresti la felicita' non solo mia ma di tante altre persone;

2 - Quando hai il documento in un albero DOM, e' facilmente modificabile. Da quello che ho capito vorresti STAMPARE (in stringa, a video, in un file, ...) il contenuto in formato html, giusto?
Non so come l'albero DOM sia stato creato, ma da quanto mi hai detto mi sono fatto un'idea.
Potresti partire, per esempio, da una visita in preordine, stampando ricorsivamente non solo il nodo, ma anche i suoi sottonodi, ottenendo la porzione di pagina.

Un esempio (non prenderlo come codice funzionante, non l'ho provato e mancano anche dei pezzi) potrebbe essere:

public String printNode (Node node)
{
String name = node.getNodeName (); // Get the node name

String attributes = getAttributes (node); // Just scan attributes and print in form NAME=VALUE

String startTag = "<" + name + " " + attributes + ">";
String childTags = "";
// Now you have to scan all children!!!
NodeList nodeList = node.getChildNodes();
for (int i = 0; i < nodeList.getLength(); i++)
{
Node child = nodeList.item (i);
childTags += printNode (child);
}
String endTag = "</" + name + ">";

return startTag + childTags + endTag;
}

Se ho capito il tuo problema, questo dovrebbe essere sufficiente. Ovviamente e' solo uno schema, poiche' ci sono dei tag che non devono essere chiusi, non leggo le entita' Text e cosi' via.
Modificando questo potresti ottenere il tuo codice finale.

Se invece sono andato fuori tema.... OPS, scusami!!!

5 - La JLabel ti permette di visualizzare, come ti ho mostrato prima. La stessa cosa vale, per esempio, per i JButton e tutti gli altri controlli. Naturalmente se vuoi seguire dei link e' un'altra cosa.


Spero che ti sia di aiuto

High Flying
Sottovento

gaglioppo
13-03-2006, 16:08
Allora, io sto usando NekoHtml:
http://java-source.net/open-source/html-parsers/nekohtml

ma c'è pure JTidy:
http://jtidy.sourceforge.net/

Creare l'albero e scorrerlo è semplicissimo:


DOMParser parser = new DOMParser();
parser.parse(UrlSottoFormaDiStringa);
// a questo punto l'abero è già creato

LeggiAlbero(parser.getDocument());
....

public static void LeggiAlbero(Node node){
String NomeTagHtml = "" + node.getNodeName();
Node child = node.getFirstChild();
while (child != null) {
LeggiAlbero(child);
child = child.getNextSibling();
}
}


Per quanto riguarda il tuo pezzo di pseudo-codice è quello che mi ero augurato di nn scrivere :-)
In realtà sarei interessato a pochi tipi di tag e mi starebbe anche bene crearmeli.... vediamo se troviamo una soluzione più rapida.
Non so se per i tag tipo Table che hanno un inizio ed una fine sia possibile seguire l'albero per chiuderlo ...hum.... a livello di efficienza come stiamo messi?

sottovento
13-03-2006, 16:15
Grazie per i link, scarico subito. Non ne sapevo nemmeno l'esistenza, di una libreria cosi!

Per quanto riguarda il codice...beh, si tratta di un lavoro onesto, te la cavi con una cinquantina di righe. Un'altra soluzione... non mi viene niente per ora.

L'efficienza non e' malaccio, nonostante la ricorsione possa diventare profondamente innestata. Cmq scandisci gli elementi una sola volta.
Infine... non devi seguire l'albero per chiudere un elemento. Non conosco la libreria, ma a rigor di logica non dovrebbe minimamente servire.

High Flying
Sottovento

gaglioppo
13-03-2006, 17:17
effettivamente catturare da <table> a </table> potrebbe nn servirmi.

Analizzo la cosa:

parto dall'albero e man mano che incontro un nodo mi creo una stringa, esempio:

nodo 1: String n1="<html>";
...
..
nodo i: String ni="<table.....>";
nodo i+1: String ni2="<tr>";
...

nodo j: String nj="</table>";

una per una queste stringhe andrebbero in dei JLabel:

JLabel jl1=new JLabel(n1);
e verrebbero visualizzati.

Il problema potrebbe essere quello di avere la necessità di avere un blocco intero da <table> a </table> come unica stringa e quindi unico oggetto JLabel da visualizzare....

Ma nn so se mi servirà tutto ciò.....

Per ora sono arrivato a visualizzare pezzi di codice html come verrebbero visualizzati nel browser, con un mouseListener che consente di cliccare sui diversi pezzi di codice e di aprire una finestra di popup....

Piano Piano l'opera si sta completando....

Mi manca il pezzo che porta da nodo a oggetto cliccabile, ma ora sappiamo come realizzarlo.

gaglioppo
14-03-2006, 07:54
Problemi:

Usando la JLabel per mostrare l'html vado incontro a grossi problemi
La logica è questa:

JLabel label=new JLabel("<html><body>"+codiceHtmlTag+"</body></html>");

dove codiceHtmlTag contiene il codice html del singolo tag.
Ad esempio:

codiceHtmlTag1="<select name=scelta>";
codiceHtmlTag2="<OPTION selected>";
codiceHtmlTag3="yes";
codiceHtmlTag4="<OPTION>";
codiceHtmlTag5="no";

(dove oltretutto mancano i tag di chiusura)

quindi si ottengono in diversi jLabel:
<html><body><select name=scelta></body></html>
<html><body><OPTION selected></body></html>
<html><body>yes</body></html>
<html><body><OPTION></body></html>
<html><body>no</body></html>

quindi non si ottiene, come vorrei una select con le scritte yes e no, ma
una select vuota e accanto due testi, yes e no, per non parlare dei tag
option che nn vengono visualizzati(chiaramente).

Dovrei raggruppare tag di questo tipo in un'unica stringa da incorporare in una JLabel, ma, per esempio, i tag form, dovrebbero essere divisi per input, textarea, select, radiobutton, checkbox ecc. (ricordo che mi serve una interfaccia in cui è possibile cliccare sui singoli elementi e una form, per i miei scopi, non è un singolo elemento).

A questo punto ci vorrebbe qualcosa di diverso rispetto al JLabel oppure dovrei seguire un'altra strada, nn so.....

sottovento
14-03-2006, 08:23
Problemi:

Usando la JLabel per mostrare l'html vado incontro a grossi problemi
La logica è questa:

JLabel label=new JLabel("<html><body>"+codiceHtmlTag+"</body></html>");

dove codiceHtmlTag contiene il codice html del singolo tag.
Ad esempio:

codiceHtmlTag1="<select name=scelta>";
codiceHtmlTag2="<OPTION selected>";
codiceHtmlTag3="yes";
codiceHtmlTag4="<OPTION>";
codiceHtmlTag5="no";

(dove oltretutto mancano i tag di chiusura)

quindi si ottengono in diversi jLabel:
<html><body><select name=scelta></body></html>
<html><body><OPTION selected></body></html>
<html><body>yes</body></html>
<html><body><OPTION></body></html>
<html><body>no</body></html>

quindi non si ottiene, come vorrei una select con le scritte yes e no, ma
una select vuota e accanto due testi, yes e no, per non parlare dei tag
option che nn vengono visualizzati(chiaramente).

Dovrei raggruppare tag di questo tipo in un'unica stringa da incorporare in una JLabel, ma, per esempio, i tag form, dovrebbero essere divisi per input, textarea, select, radiobutton, checkbox ecc. (ricordo che mi serve una interfaccia in cui è possibile cliccare sui singoli elementi e una form, per i miei scopi, non è un singolo elemento).

A questo punto ci vorrebbe qualcosa di diverso rispetto al JLabel oppure dovrei seguire un'altra strada, nn so.....

Ciao,
non penso che tu possa usare la JLabel per QUESTO tipo di codice. La JLabel, come JButton e tutto il resto, utilizzano i tag HTML soltanto per rappresentazione. Quello che tu vorresti fare e' utilizzare i tag html per l'introduzione dei dati. Non dovrebbe essere possibile (uso il condizionale perche' ogni tanto le cose vengono cambiate, ma sono sicuro al 90%).

Per quanto riguarda il codice che hai prodotto, probabilmente esiste un modo diverso per produrlo. Se hai gli item in un albero DOM, posso scommettere che le varie OPTION sono figlie della SELECT, pertanto una scansione ricorsiva di quel punto dell'albero ti risolve il problema.

Tornando al problema principale: vorresti poter leggere le scelte dell'utente
mediante i tag html. Si tratta di una funzionalita' "da browser". Sicuramente una JLabel non e' sufficiente, e comincio a nutrire dei dubbi sulla JEditorPane.

Forse e' il caso di cercare una libreria su Internet....

High Flying
Sottovento