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

    Come far restituire un albero a WS?

    Ho fatto un Web Service il cui scopo è recuperare da database e altre risorse dei dati associati ad un identificativo. Gli identificativi possono essere direttamente associati a dei dati (caso semplice), o possono essere stati "splittati" in più identificativi (ognuno dei quali può essere direttamente associato ai dati o a sua volta splittato).

    Morale ho fatto un metodo ricorsivo che più o meno fa questo:
    preso l'identificativo, lo cerco nel DB e se è presente nel restituisco i dati (base della ricorsione)
    se non è presente nel DB faccio il parsing di una pagina html che me ne indica gli split. Se ci sono split lancio la chiamata ricorsiva per ognuno degli identificativi trovati, altrimenti ne deduco che l'identificativo non esiste e restituisco null.

    In questo modo, usando due parametri (identificativo e padre.. che ovviamente è null per la radice) riesco a visitare (in profondità) l'intero "albero" generato da un identificativo.

    Il problema che ho è come gestire i dati per poi restituirli al client.
    Non essendo molto pratico di Java e delle sue strutture dati, in fase di testing ho usato la cosa più semplice possibile: una concatenazione di stringhe con separatori.

    per esempio:
    se ho un identificativo I1 che è diviso in I2 e I3, e per I2 ho direttamente il dato D2 mentre I3 si divide in I4 e I5 che hanno associati i dati D4 e D5 rispettivamente.... ho il seguente albero
    codice:
        I1
        |
     ----------------
     |              |
     I2            I3
     |              |
     D2        -------------
               |           |
              I4          I5
               |           |
              D4          D5
    e al momento la stringa corrispondente è fatta così
    I1.I2->D2; I1.I3.I4->D4; I1.I3.I5->D5;

    In questo modo con qualche manipolazione lato client (PHP) resco a dare l'idea del "percorso" utilizzato per arrivare al dato... però ecco.. non mi convince molto e prima di impelagarmi in manipolazioni pesanti lato client per visualizzare i dati in modo comprensibile vorrei sapere da voi se avete qualche idea migliore su come costruirmi e trasmettere questa strutura dati per una più facile manipolazione lato client.

    Grazie

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

    Re: Come far restituire un albero a WS?

    Originariamente inviato da }gu|do[z]{®©
    e al momento la stringa corrispondente è fatta così
    I1.I2->D2; I1.I3.I4->D4; I1.I3.I5->D5;

    In questo modo con qualche manipolazione lato client (PHP) resco a dare l'idea del "percorso" utilizzato per arrivare al dato... però ecco.. non mi convince molto e prima di impelagarmi in manipolazioni pesanti lato client per visualizzare i dati in modo comprensibile vorrei sapere da voi se avete qualche idea migliore su come costruirmi e trasmettere questa strutura dati per una più facile manipolazione lato client.
    Un "albero" (n-ario, cioè con nodi con un numero arbitrario di figli) è semplicemente una struttura dati in cui, visto al livello più piccolo, c'è un nodo e una lista di suoi nodi "figli".

    Quindi basterebbe trovare una sintassi che permetta di indicare, sempre al livello più piccolo, il nome del nodo e marcare l'inizio e poi la fine della lista dei figli.

    Un esempio potrebbe essere:
    codice:
    I1{I2{D2},I3{I4{D4},I5{D5}}}
    In pratica ID poi { ...lista dei nodi "figli" separati da virgola... }
    E chiaramente puoi fare tutte le "varianti" che vuoi a livello di sintassi (cambiare separatore, deliminatori dei figli, ecc....)

    Altra possibilità .... beh, ovviamente XML! Che è fatto apposta per rappresentare dati strutturati ad albero.
    codice:
    <?xml version="1.0"?>
    <id name="I1">
      <id name="I2">
        <id name="D2"/>
      </id>
      <id name="I3">
        <id name="I4">
          <id name="D4"/>
        </id>
        <id name="I5">
          <id name="D5"/>
        </id>
      </id>
    </id>
    Anche qui si possono fare tutte le varianti che vuoi. Io l'ho indentato e messo su più righe ... non sarebbe obbligatorio. E se il nome di ogni ID rispetta le regole sui nomi dei tag XML si potrebbe anche mettere come nomi dei tag direttamente i nomi dei tuoi ID. Io li ho messi come valori di un attributo 'name' per farlo a livello generale.

    Quale scegliere? Nel primo caso la sintassi la "inventi" tu e quindi devi scrivere del codice per "parsare" le informazioni. Nel secondo caso si dovrebbe usare un parser XML (con approccio SAX o DOM).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    ti ringrazio..
    il primo approccio è un po' quello che ho fatto fin'ora in pratica... l'approccio xml non l'avevo pensato ma in effetti mi sembra la csa più pulita.. il fatto è che ne so pochino.. dove posso documentarmi un attimo?

    Grazie

  4. #4
    Utente di HTML.it L'avatar di kuarl
    Registrato dal
    Oct 2001
    Messaggi
    1,093
    Originariamente inviato da }gu|do[z]{®©
    ti ringrazio..
    il primo approccio è un po' quello che ho fatto fin'ora in pratica... l'approccio xml non l'avevo pensato ma in effetti mi sembra la csa più pulita.. il fatto è che ne so pochino.. dove posso documentarmi un attimo?

    Grazie
    riguardo xml e il suo utilizzo con java?
    beh, ci sono diverse librerie built in per l'analisi e la modifica dei documenti utilizzando api diverse.
    http://www.google.it/search?q=xml+e+...ient=firefox-a

    se invece proprio non sai come funziona xml beh... diciamo che è una generalizzazione dell'html, puoi definire i tag che vuoi e usarli secondo le regole che te stesso stabilisci.
    Nell'esempio di sopra invece di usare un tag id, secondo me sarebbe più efficace nominarlo <nodo> e inserire il suo id come attributo del tag, una cosa come

    codice:
    <nodo id="111">
       <nodo id="222">
       </nodo>
    </nodo>
    per la generazione invece delle librerie puoi usare anche le semplici funzioni di testo, comunque ti consiglio di dare un occhiata comunque alle varie librerie, che diventano essenziali per fare il parsing del documento.

  5. #5
    Originariamente inviato da kuarl
    riguardo xml e il suo utilizzo con java?
    beh, ci sono diverse librerie built in per l'analisi e la modifica dei documenti utilizzando api diverse.
    http://www.google.it/search?q=xml+e+...ient=firefox-a

    se invece proprio non sai come funziona xml beh... diciamo che è una generalizzazione dell'html, puoi definire i tag che vuoi e usarli secondo le regole che te stesso stabilisci.
    Nell'esempio di sopra invece di usare un tag id, secondo me sarebbe più efficace nominarlo <nodo> e inserire il suo id come attributo del tag, una cosa come

    codice:
    <nodo id="111">
       <nodo id="222">
       </nodo>
    </nodo>
    per la generazione invece delle librerie puoi usare anche le semplici funzioni di testo, comunque ti consiglio di dare un occhiata comunque alle varie librerie, che diventano essenziali per fare il parsing del documento.
    vabbè, una idea di come sia fatto l'xml ce l'ho
    In un WS che ho fatto ho dovuto anche fare il parsing di un documento.. mi chiedevo come generarlo e cose così.. mo' do un'occhiata..

    grazie ^_^

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da }gu|do[z]{®©
    il primo approccio è un po' quello che ho fatto fin'ora in pratica...
    Ma la stringa che avevi composto ha un formato poco "strutturato" e oltretutto male .... che non rendeva affatto la idea dell'albero, cioè che un nodo possa avere più figli, ecc....

    Insomma, per dirla in altro modo .... se tu non avessi postato il blocco di testo che mostrava graficamente, con le lineette, l'albero dei nodi, io personalmente avrei fatto molta fatica a capire che la stringa

    I1.I2->D2; I1.I3.I4->D4; I1.I3.I5->D5;

    rappresentava (per te) un albero!!! Poteva sembrare un set di proprietà chiave-valore abc->xyz; o altro ..... ma non un albero!!! E chiaramente essendo molto particolare (vedo almeno 3 caratteri speciali, "." e "->" e ";" sarebbe anche più difficile da parsare!).

    Cioè ti è chiaro??? Un approccio di questo tipo tecnicamente è corretto e potrebbe anche andare bene (ed è oltretutto una forma molto compatta) ma va fatto rendendo semplice e, cosa più importante, logica la sintassi/struttura. Non sparando a caso .....

    Originariamente inviato da }gu|do[z]{®©
    l'approccio xml non l'avevo pensato ma in effetti mi sembra la csa più pulita.. il fatto è che ne so pochino.. dove posso documentarmi un attimo?
    Dipende, chiarisci meglio: il documento XML lo devi generare e scrivere da Java e poi leggere e parsare da PHP?

    In Java puoi generare e scrivere un documento XML in svariati modi (e usando diverse librerie). Attraverso le API standard JAXP, con le librerie JDOM o DOM4J o anche altro. Trovi esempi tra i miei Java Examples, sezione XML.

    In PHP ci sono funzioni e API apposite per il parsing di documenti XML, per questo ti rimando al manuale ufficiale online: XML Manipulation
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    sì sì.. hai ragione riguardo la stringa... è nata così perchè in altri casi di dati meno strutturati me l'ero cavata con una stirnga.. e allora anche in questo caso ero partito con lo stesso approccio, ma la ricorsione mi ha fregato

    Riguardo XML, esattamente come hai detto.
    Il documento XML lo devo generare man mano che procedo nella visita dell'albero di ricorsione, e poi restituire al client PHP.. ma sul PHP ho meno problemi a muovermi e più disinvoltura... l'unico problema sarebbe come presentarlo a video, ma ci penserò dopo.

    Mi documento un po' allora, grazie!

  8. #8
    Rieccomi.. ho ripreso la cosa dopo un po' di altri progetti...

    andbin, ho dato un'occhiata al tuo esempio JAXP e ispirandomici ho tirato fuori qualcosa con la mia ricorsione (non ho i dati a priori, me li ricavo interrogando un altro servizio non gestito da me che di volta in volta mi da l'elenco dei figli di un nodo):

    getIdtValue(id) (il metodo chiamato dal cilient)
    -crea il documento xml e un nodo root
    -chiama un getIdValue(id,root) (dove nodo=root, e id è quello ricevuto dal client)

    getIdValue(id,padre)
    -Crea un nuovo nodo id e lo attacca a padre.
    -Se id non ha figli (passo base della ricorsione), attacca a id un nodo value con il valore associato alla foglia.
    -Altrimenti per ogni figlio di id fa la chiamata ricorsiva getIdValue(figlioid,id)

    A rigor di logica funziona, e compila pure.. ma non capisco come restituire come stringa l'xml così creato

    Vedo che nel tuo esempio ( http://andbin.altervista.org/java/ex...dWriteXml.java )
    usi del codice per scrivere l'xml su file..
    codice:
                // Writes XML document to a file.
                TransformerFactory tf = TransformerFactory.newInstance();
                Transformer transformer = tf.newTransformer();
    
                Source source = new DOMSource(document);
                Result result = new StreamResult("books.xml");
                transformer.transform(source, result);
    ma non ho proprio capito come modificarlo per salvare l'xml in una var String, potresti spiegarmelo o farmici un esempio?

    Grazie

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da }gu|do[z]{®©
    ma non ho proprio capito come modificarlo per salvare l'xml in una var String, potresti spiegarmelo o farmici un esempio?
    Oh certo! Ed è anche semplice. Quel transform() riceve 2 argomenti: una "sorgente" (un javax.xml.transform.Source) e una "destinazione" (beh, lì tecnicamente si chiama "Result" cioè un javax.xml.transform.Result).
    Queste sono 2 interfacce e ci sono diverse implementazioni per ognuna. Io ho usato StreamResult che può essere istanziato specificando di scrivere su un File o su un OutputStream oppure ancora ..... su un Writer!!

    E tra le classi in java.io c'è un StringWriter. Hai già intuito?? StringWriter è semplicemente un Writer che scrive su un suo buffer interno. Alla fine puoi ottenere la stringa con il solito toString().

    codice:
    StringWriter sw = new StringWriter();
    Result result = new StreamResult(sw);
    transformer.transform(source, result);
    String xmlString = sw.toString();
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Originariamente inviato da andbin
    Oh certo! Ed è anche semplice. Quel transform() riceve 2 argomenti: una "sorgente" (un javax.xml.transform.Source) e una "destinazione" (beh, lì tecnicamente si chiama "Result" cioè un javax.xml.transform.Result).
    Queste sono 2 interfacce e ci sono diverse implementazioni per ognuna. Io ho usato StreamResult che può essere istanziato specificando di scrivere su un File o su un OutputStream oppure ancora ..... su un Writer!!

    E tra le classi in java.io c'è un StringWriter. Hai già intuito?? StringWriter è semplicemente un Writer che scrive su un suo buffer interno. Alla fine puoi ottenere la stringa con il solito toString().

    codice:
    StringWriter sw = new StringWriter();
    Result result = new StreamResult(sw);
    transformer.transform(source, result);
    String xmlString = sw.toString();
    perfetto... mo' provo.. grazie.. a volt emi perdo nella miriade di oggetti Java

    grazie mille!

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 © 2025 vBulletin Solutions, Inc. All rights reserved.