|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Monza
Messaggi: 598
|
[java-html] da nodo ad html
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
__________________
Nunc est bibendum |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Monza
Messaggi: 598
|
up
__________________
Nunc est bibendum |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Ciao,
hai provato con JEditorPane? Dovrebbe fare al caso tuo. High Flying Sottovento |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Monza
Messaggi: 598
|
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?
__________________
Nunc est bibendum |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
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 |
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Monza
Messaggi: 598
|
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?)
__________________
Nunc est bibendum |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
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 |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Monza
Messaggi: 598
|
Allora, io sto usando NekoHtml:
http://java-source.net/open-source/h...rsers/nekohtml ma c'è pure JTidy: http://jtidy.sourceforge.net/ Creare l'albero e scorrerlo è semplicissimo: Codice:
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();
}
}
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?
__________________
Nunc est bibendum |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
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 |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Monza
Messaggi: 598
|
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.
__________________
Nunc est bibendum |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Monza
Messaggi: 598
|
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.....
__________________
Nunc est bibendum |
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
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 |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:49.



















