Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [java]: Problema visualizzazione xml in un jtree

    Ciao a tutti sto realizzando un'applicazione che dato un file xml in ingresso, me lo visualizza sottoforma di albero jtree. Posto anche un'immagine di quello che sono riuscito a realizzare.
    Il problema è il seguente: come faccio a inserire nello jtree anche quegli attributi inseriti tra i tag?
    Mi spiego meglio:

    dallo screen (collegamento in basso) si vede il tag
    <item id="21-Lug">
    ....
    ...
    </item>
    ed io non riesco ad inserire anche l'attributo id con relativo valore nello jtree associato.
    Qualcuno sà come si fà?

    Ecco il codice: il metodo e la classe che implementa TreeModel con l'override dei metodi che mi interessavano.
    Grazie in anticipo

    codice:
    public void createXMLTree (File xml) {
      		
      		try {
      			  DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
      			  DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
      			  Document doc = dBuilder.parse(xml);
      			  doc.getDocumentElement().normalize();
      		 
      			  
      			  Node root = doc.getDocumentElement();
      			  XmlTreeModel model = new XmlTreeModel(root);
      			  tree.setModel(model);
      			  tree.setVisible(true);
      		  } catch (Exception e) {
      		    e.printStackTrace();
      		  }
      		  
      	}

    codice:
    class XmlTreeModel implements TreeModel {
    
    	protected Node root;
    
    	public XmlTreeModel(Node root){
    
    		this.root = root;
    
    	}
    	
    	//  Adds a listener for the TreeModelEvent posted after the tree changes.
    	@Override
    	public void addTreeModelListener(TreeModelListener arg0) {
    		// TODO Auto-generated method stub
    		
    	}
    	// Returns the child of parent at index index in the parent's child array.
    	@Override
    	public Object getChild(Object parent, int index) {
    		Node child = ((Node)parent).getChildNodes().item(index);
    		return (Object)child;
    	}
    	// Returns the number of children of parent.
    	@Override
    	public int getChildCount(Object parent) {
    		return ((Node)parent).getChildNodes().getLength();
    	}
    	// Returns the index of child in parent.
    	@Override
    	public int getIndexOfChild(Object parent, Object child) {
    		
    		NodeList childs = ((Node)parent).getChildNodes();
    		
    		if (childs.getLength() == 0) { 
    			return -1;
    		}
    		
    		else {
    			for (int i=0; i<childs.getLength(); i++){
    				if (childs.item(i) == (Node)child) return i;
    		    }
    			return -1;
    		}
    		
    	}
    	// Returns the root of the tree.
    	@Override
    	public Object getRoot() {
    		return (Object)this.root;
    	}
    	@Override
    	// Returns true if node is a leaf.
    	public boolean isLeaf(Object node) {
    		// org.w3c.dom.Node.ELEMENT_NODE corrisponde al valore 7
    		// org.w3c.dom.Node.ATTRIBUTE_NODE corrisponde al valore 1
    		if ((((Node)node).getNodeType()==org.w3c.dom.Node.ELEMENT_NODE ) || (((Node)node).getNodeType()==org.w3c.dom.Node.ATTRIBUTE_NODE )) {
    			return false;
    		}
    		
    		else {
    			return true;
    		}
    				
    	}
    	// Removes a listener previously added with addTreeModelListener.
    	@Override
    	public void removeTreeModelListener(TreeModelListener arg0) {
    		// TODO Auto-generated method stub
    		
    	}
    	// 
    	@Override
    	public void valueForPathChanged(TreePath arg0, Object arg1) {
    		// TODO Auto-generated method stub
    		
    	}
    
    }
    http://www.zshare.net/image/66098282c1663303/

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [java]: Problema visualizzazione xml in un jtree

    Originariamente inviato da ViRUZ_gTi
    come faccio a inserire nello jtree anche quegli attributi inseriti tra i tag?
    La cosa più logica è fare in modo che un nodo nel tuo JTree che rappresenta un "tag" (Element) abbia dei "figli" uno per ogni attributo. Poi si potrebbe discutere se mettere nel nodo figlio la indicazione completa di nome=valore oppure eventualmente fare in modo che il nodo dell'attributo abbia a sua volta un figlio per il valore. Come ho detto ... è da valutare.

    Quando incontri un Node che è un Element allora puoi usare getAttributes() che ti fornisce un NamedNodeMap che rappresenta un insieme di Node che sono effettivamente degli Attr.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3

    Re: Re: [java]: Problema visualizzazione xml in un jtree

    Originariamente inviato da andbin
    La cosa più logica è fare in modo che un nodo nel tuo JTree che rappresenta un "tag" (Element) abbia dei "figli" uno per ogni attributo. Poi si potrebbe discutere se mettere nel nodo figlio la indicazione completa di nome=valore oppure eventualmente fare in modo che il nodo dell'attributo abbia a sua volta un figlio per il valore. Come ho detto ... è da valutare.

    Quando incontri un Node che è un Element allora puoi usare getAttributes() che ti fornisce un NamedNodeMap che rappresenta un insieme di Node che sono effettivamente degli Attr.
    Ti ringrazio per la pronta risposta, dunque proprio per questi problemi di valutazione ho deciso di cambiare un pò l'applicazione e vorrei farlo creando una jtable nella quale una volta selezionato il nodo della jtree mi compare una tripla (nodo selezionato, attributo, valore) che poi sarebbero le colonne della jtable.
    Per fare ciò dovrei modificare la classe Nodo inserendo una sorta di hashtable<String key, String value> ma non sò come fare quest'ultimo passaggio.
    Sapresti indicarmi come poter modificare la classe nodo?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Re: Re: [java]: Problema visualizzazione xml in un jtree

    Originariamente inviato da ViRUZ_gTi
    una volta selezionato il nodo della jtree mi compare una tripla (nodo selezionato, attributo, valore) che poi sarebbero le colonne della jtable.
    Perché 3?? Il nodo selezionato a parte che lo vedi nel JTree ... comunque nella tabella sarebbe duplicato. Al massimo potresti mettere la informazione sul nodo selezionato come "titolo" in una label o simile.
    Dico bene? (ovviamente non so esattamente come e perché vuoi fare le cose ...)

    Originariamente inviato da ViRUZ_gTi
    Per fare ciò dovrei modificare la classe Nodo inserendo una sorta di hashtable<String key, String value> ma non sò come fare quest'ultimo passaggio.
    Non ho esaminato bene il codice che hai postato ma .... un nodo del tuo JTree "contiene" il riferimento al Node del documento XML? Cioè mantieni riferimenti "vivi" ai nodi del documento?

    Allora non servirebbero mappe, hashtable o roba simile. Devi semplicemente realizzare un "tuo" table model (estendi AbstractTableModel) basato internamente su un NamedNodeMap che già "modella" un insieme di Attr indirizzabili tramite un "indice" (quindi appropriato per un tabella!).

    Quando selezioni un nodo nel tuo JTree e verifichi se è un Element e prendi il NamedNodeMap degli attributi e lo passi al "tuo" table model, che se lo tiene dentro e notifica la tabella per l'aggiornamento (il solito fireXXX dell'evento appropriato). Il table model "espone" nome/valore degli attributi.

    Così sarebbe molto ben fatto e pulito.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5

    Re: Re: Re: [java]: Problema visualizzazione xml in un jtree

    Perché 3?? Il nodo selezionato a parte che lo vedi nel JTree ... comunque nella tabella sarebbe duplicato. Al massimo potresti mettere la informazione sul nodo selezionato come "titolo" in una label o simile. Dico bene? (ovviamente non so esattamente come e perché vuoi fare le cose ...)
    si hai ragione è ridondante il nome del nodo selezionato

    Non ho esaminato bene il codice che hai postato ma .... un nodo del tuo JTree "contiene" il riferimento al Node del documento XML? Cioè mantieni riferimenti "vivi" ai nodi del documento? Allora non servirebbero mappe, hashtable o roba simile. Devi semplicemente realizzare un "tuo" table model (estendi AbstractTableModel) basato internamente su un NamedNodeMap che già "modella" un insieme di Attr indirizzabili tramite un "indice" (quindi appropriato per un tabella!). Quando selezioni un nodo nel tuo JTree e verifichi se è un Element e prendi il NamedNodeMap degli attributi e lo passi al "tuo" table model, che se lo tiene dentro e notifica la tabella per l'aggiornamento (il solito fireXXX dell'evento appropriato). Il table model "espone" nome/valore degli attributi. Così sarebbe molto ben fatto e pulito.
    si è vero stavo proprio vedendo che NomedNodeMap contiene tutto quello che mi serve e quindi è inutile inserire questa hashtable

    Dal momento che userò una jtable, affiancata allo jtree, per visualizzare gli attributi, vorrei visualizzare nello jtree solamente i nodi e non quei campi tipo #text o quei valori NULL che si vedono nello screen che ho postato precedentemente. In pratica vorrei visualizzare solo i nodi col nome collegati tra loro... per fare ciò dovrei associare i nodi di tipo org.w3c.dom.Node usati per il parsing dom ai nodi di tipo DefaultMutableTreeNode dello jtree ed effettuare la creazione dell'albero da capo senza quel model che ho postato oppure c'è una strada più semplice?
    grazie ancora

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Re: Re: Re: [java]: Problema visualizzazione xml in un jtree

    Originariamente inviato da ViRUZ_gTi
    Dal momento che userò una jtable, affiancata allo jtree, per visualizzare gli attributi, vorrei visualizzare nello jtree solamente i nodi e non quei campi tipo #text o quei valori NULL che si vedono nello screen che ho postato precedentemente. In pratica vorrei visualizzare solo i nodi col nome collegati tra loro... per fare ciò dovrei associare i nodi di tipo org.w3c.dom.Node usati per il parsing dom ai nodi di tipo DefaultMutableTreeNode dello jtree ed effettuare la creazione dell'albero da capo senza quel model che ho postato oppure c'è una strada più semplice?
    Premetto che JTree e il suo "modello" è quello che conosco di meno tra i componenti Swing (anche perché l'avrò usato sì e no 1 o 2 volte ...), quindi dovrei andare a vedere la documentazione. Comunque le strade sono principalmente 2: o definisci un "tuo" tree model (quello che stavi già cercando di fare prima), oppure usi il DefaultTreeModel che contiene nodi DefaultMutableTreeNode i quali possono contenere un "Object" e qui decidi tu quale debba essere. Se per un org.w3c.dom.Element il toString() fornisce il nome del tag (ora non ricordo ...) allora l'Object potrebbe anche essere direttamente questo Element.
    L'albero dei DefaultMutableTreeNode lo crei appunto tu navigando nell'albero DOM.

    Di più non saprei dirti ... nel senso che dovrei provare a farlo io per vedere se viene bene ed è facile o meno.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7

    Re: Re: Re: Re: [java]: Problema visualizzazione xml in un jtree

    Premetto che JTree e il suo "modello" è quello che conosco di meno tra i componenti Swing (anche perché l'avrò usato sì e no 1 o 2 volte ...), quindi dovrei andare a vedere la documentazione. Comunque le strade sono principalmente 2: o definisci un "tuo" tree model (quello che stavi già cercando di fare prima), oppure usi il DefaultTreeModel che contiene nodi DefaultMutableTreeNode i quali possono contenere un "Object" e qui decidi tu quale debba essere. Se per un org.w3c.dom.Element il toString() fornisce il nome del tag (ora non ricordo ...) allora l'Object potrebbe anche essere direttamente questo Element. L'albero dei DefaultMutableTreeNode lo crei appunto tu navigando nell'albero DOM. Di più non saprei dirti ... nel senso che dovrei provare a farlo io per vedere se viene bene ed è facile o meno.
    Ti ringrazio davvero gentilissimo, non ti preoccupare mi hai dato comunque ottime info.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.