Recuperare nomi variabili da esportare in xml

di il
2 risposte

Recuperare nomi variabili da esportare in xml

Salve a tutti
sto costruendo un applicazione dove vanno inseriti diversi campi di testo, combo e checklist
alla fine devo creare un file xml che contenga tutti i dati inseriti
fin qui tutto ok
essendo alcune centinaia i campi da compilare, ed essendo in fase ancora di costruzione, quindi potrebbero crescere, vorrei trovare il modo di "estrapolare" direttamente dall'app la coppia nome variabile e suo valore al fine di creare un xml del tipo
<variabili>
   <variabile nome="var1"> valoreVariabile </variabile>
   <variabile nome="var2"> valoreVariabile </variabile>
   ....
</variabili>
il testo generato mi serve per la mia applicazione per poter andare a rileggere i dati già inseriti in precedenza ma servono anche ad un altra applicazione non generata da me

per ora riesco solo ad estrapolare il valore ma non il nome della variabile
vorrei evitare di scriverle tutte a mano per evitare errori o dimenticanze

Note : uso SWT

quello che segue è un semplice esempio su cui sto effettuando le prove
package test;

import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;

public class TestPerXml {
	private static Text txt01;
	private static Text txt02;

	/**
	 * Launch the application.
	 * @param args
	 */
	public static void main(String[] args) {
		Display display = Display.getDefault();
		Shell shell = new Shell();
		shell.setSize(450, 300);
		shell.setText("SWT Application");
		
		TabFolder tabFolder01 = new TabFolder(shell, SWT.NONE);
		tabFolder01.setBounds(10, 10, 414, 241);
		
		TabItem tabt01 = new TabItem(tabFolder01, SWT.NONE);
		tabt01.setText("Item 01");
		
		Composite composite01 = new Composite(tabFolder01, SWT.NONE);
		tabt01.setControl(composite01);
		
		Label lbl01 = new Label(composite01, SWT.NONE);
		lbl01.setBounds(10, 10, 55, 15);
		lbl01.setText("Label 01");
		
		txt01 = new Text(composite01, SWT.BORDER);
		txt01.setText("AAA");
		txt01.setBounds(85, 7, 76, 21);
		
		TabItem tbt02 = new TabItem(tabFolder01, SWT.NONE);
		tbt02.setText("Item 02");
		
		Composite composite02 = new Composite(tabFolder01, SWT.NONE);
		tbt02.setControl(composite02);
		
		Label lbl02 = new Label(composite02, SWT.NONE);
		lbl02.setText("Label 2");
		lbl02.setBounds(10, 13, 55, 15);
		
		txt02 = new Text(composite02, SWT.BORDER);
		txt02.setText("BBB");
		txt02.setBounds(85, 10, 76, 21);
		
		
		Control[] children = shell.getChildren();
        Control[] tabfolder = tabFolder01.getChildren();
        Control[] composit = composite01.getChildren();
        System.out.println(children.length);
        System.out.println(tabfolder.length);
        System.out.println(composit.length);
       
        Composite composit1 = composite01.getParent();
        Composite composit2 = composite02.getParent();

        System.out.println("composite Parent ");
        System.out.println("composite Parent : " + composit1);
        System.out.println("composite_2 Parent : " + composit2);
       
       
      for (int i = 0; i < children.length; i++) {
        Control child = children[i];
        System.out.println("stampa children");
        System.out.println(child);
        System.out.println("-");

      }
     
      for (int i = 0; i < tabfolder.length; i++) {
              Control tbf = tabfolder[i];
              System.out.println("stampa tabfolder");
              System.out.println(tbf.getClass().getSimpleName());
              System.out.println("*");

            }
       
     
      for (int i = 0; i < composit.length; i++) {
              Control comp = composit[i];
              System.out.println("stampa composite");
              System.out.println(comp.getClass().getSimpleName());
             
              Text ppp;
              if(comp.getClass().getSimpleName().equals("Text")) {
                 ppp = (Text)comp;
                 System.out.print("trovata variabile Text : ");
                 System.out.println(ppp.getText());
                 System.out.println(comp.getData("*"));
              }
             

            }
		
		
		
		
		
		

		shell.open();
		shell.layout();
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch()) {
				display.sleep();
			}
		}
	}
}
grazie

2 Risposte

  • Re: Recuperare nomi variabili da esportare in xml

    zaiocrit ha scritto:


    per ora riesco solo ad estrapolare il valore ma non il nome della variabile
    Il tuo codice non può conoscere i nomi delle variabili a livello di compilazione. Se sono variabili "di istanza" o "di classe", i nomi delle variabili li puoi conoscere a runtime solo tramite l'uso della "reflection".

    Quindi o sfrutti tu la reflection implementando una logica di ricerca delle variabili, possibilmente di istanza (non mettere quei campi static!), cosa che non è difficilissima .... oppure sfrutti un qualche framework di binding tra classi Java e XML.
    Dipende da quale API intendi usare per generare/parsare il documento XML.

    P.S. if(comp.getClass().getSimpleName().equals("Text"))
    è abbastanza "brutto".

    Meglio sarebbe

    if (comp.getClass() == Text.class)


    P.S.2): sempre tramite reflection, puoi anche sfruttare una tua annotation con cui marchi i campi da memorizzare. E magari la annotation può avere il value() che indica il nome da usare nel XML, così non usi il nome del campo fisico nella classe che puoi cambiare liberamente in futuro.

    In pratica potresti definire una tua annotation es. @FieldVar da usare es.:
    public class Xyz {
        @FieldVar("nome")
        private Text nameText;
    
    ....
    A runtime non è difficile trovare tutti i campi annotati con @FieldVar.
  • Re: Recuperare nomi variabili da esportare in xml

    Grazie Andrea !
    stavo diventando matto con la reflection... vado un po' in confusione
    ero riuscito a trovare tutto l'elenco dei campi, ma non il loro valore

    adesso provo a sfruttare l'annotation... interessante

    grazie ancora !
Devi accedere o registrarti per scrivere nel forum
2 risposte