Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16

Hybrid View

  1. #1

    [XML] Lettura di tutti e soli i nodi di un nodo padre senza saperne la struttura(nomi tag).

    Per analogia mi riferisco ad un albero con rami(nodi primari) e foglie(nodi secondari).

    Un metodo per la lettura potrebbe essere il seguente:

    Si legge il primo ramo e ogni primo ramo a seguire sin all' ultimo, alla fine di questo si leggono tutte le sue foglie.

    Ora si risale al nodo parent e si continua la lettura dei rami differenti dal primo(gia' letto) con cui fare lo stesso e se presenti si leggono le foglie.


    Si itera il procedimento sin ad arrivare al nodo padre da dove si seguira' alla lettura dei successivi rami come fatto col primo ramo.

    Fin all' ultimo ramo del nodo padre che termina l'albero.



    Se questo algoritmo funziona allora mi cimento ad implementarlo.
    Ultima modifica di jabjoint; 24-03-2025 a 19:24
    jabjoint

  2. #2
    tutto se po' fa' linguaggio?

  3. #3
    Quote Originariamente inviata da optime Visualizza il messaggio
    tutto se po' fa' linguaggio?
    Java
    jabjoint

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,480
    Quote Originariamente inviata da jabjoint Visualizza il messaggio
    Si legge il primo ramo e ogni primo ramo a seguire sin all' ultimo, alla fine di questo si leggono tutte le sue foglie.
    Ora si risale al nodo parent e si continua la lettura dei rami differenti dal primo(gia' letto) con cui fare lo stesso e se presenti si leggono le foglie.
    Si itera il procedimento sin ad arrivare al nodo padre da dove si seguira' alla lettura dei successivi rami come fatto col primo ramo.
    Fin all' ultimo ramo del nodo padre che termina l'albero.
    Mi sembra un sistema alquanto inefficiente, soprattutto avendo a disposizione linguaggi (e relative strutture in memoria) di alto livello, visto che continui a scandire e rileggere comunque nodi che hai già elaborato, per caricarli oppure per saltarli.

    In aggiunta, è inutilmente farraginoso: non esiste una motivazione per cui uno dovrebbe fare una cosa del genere, potendosi caricare in memoria i dati in una struttura gerarchica.

    Quote Originariamente inviata da jabjoint Visualizza il messaggio
    Se questo algoritmo funziona allora mi cimento ad implementarlo.
    Non si capiscono i motivi per cui si dovrebbe fare una simile navigazione nel file, navigando quello che è un albero ripetute volte.

    Per la lettura del file senza determinare a priori il nome dei tag e leggendolo progressivamente, è già prevista la modalità SAX.

    In sintesi, qualunque cosa tu voglia fare con XML, esiste già una implementazione: se non esiste quella che vuoi fare tu, significa che quello che vuoi fare è meno efficiente o utile di quanto non sia già reso disponibile.

    Quote Originariamente inviata da jabjoint Visualizza il messaggio
    Java
    Forse era meglio postare nel forum di Java, visto che si parla di questo linguaggio e non specificatamente di un problema col formato XML in sé, quanto più di modi per leggero scrivendo codice (in Java, in questo caso).
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    Stavo usando DOM e non SAX.
    Non ho trovato ancora una guida chiara sull' utilizzo di Sax, almeno utile a me.
    Siccome non ho sottomano il portatile non posso restare la libreria.
    Io ho la necessità di leggere tutti i padri e per questi i figli.
    In sequenza. Posso anche estrarre tutti i nodi e infilarli in liste. Ma dovrei fare n Liste di cui oltretutto non conosco a priori n.
    Io devo leggere ogni padre per aggiungere tutti i figli ma nella corretta sequenza dell'albero.
    Probabilmente DOM stando alle informazioni del link SAX che mi hai gentilmente passato non è adatto per questo.
    jabjoint

  6. #6
    Quote Originariamente inviata da jabjoint Visualizza il messaggio
    Stavo usando DOM e non SAX.
    Non ho trovato ancora una guida chiara sull' utilizzo di Sax, almeno utile a me.
    Siccome non ho sottomano il portatile non posso testare la libreria.
    Io ho la necessità di leggere tutti i padri e per questi i figli.
    In sequenza. Posso anche estrarre tutti i nodi e infilarli in liste. Ma dovrei fare n Liste di cui oltretutto non conosco a priori n.
    Io devo leggere ogni padre per aggiungere tutti i figli ma nella corretta sequenza dell'albero.
    Probabilmente DOM stando alle informazioni del link SAX che mi hai gentilmente passato non è adatto per questo.
    Ho visto bene come funziona, senza scrivere codice.

    Ripeto non trovo tra le funzionalità di SAX la possibilità di leggere i TAG (senza saper i lori nomi).

    Nel link suggerito si usa switch(qname) che pressuppone di sapere il nome qname.


    Inoltre non trovo la possibilità di estrarre tutte le liste ordinate dei nodi di un nodo padre, come ho chiesto.
    jabjoint

  7. #7
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,480
    Quote Originariamente inviata da jabjoint Visualizza il messaggio
    Ho visto bene come funziona, senza scrivere codice.
    Ripeto non trovo tra le funzionalità di SAX la possibilità di leggere i TAG (senza saper i lori nomi).
    Scusa, ma che vuol dire questo?

    Un file XML è composto da elementi, attributi e valori: se lo leggi, è per acquisire queste informazioni!

    Puoi procedere leggendo elementi specifici per nome o in base alla posizione, ad esempio usando XPath, presupponendo di sapere già dove si trovano le informazioni che ti interessano, allo stesso modo con cui si andrebbe a navigare in un file system spostandosi in una directory precisa, indicata per nome, e poi in una sottodirectory, sempre per nome, e indirizzando uno specifico file, per fare una analogia.

    Oppure, usando l'approccio SAX, si legge il file progressivamente, individuando i nodi che lo compongono, che di volta in volta sono elementi, attributi, valori, ancora elementi, attributi, valori, spazi, commenti... dipende dalla configurazione. In sostanza, non si indirizzano elementi specifici, come con XPath, ma ci si lascia guidare dalla struttura del file che viene progressivamente scansionato dicendoci di volta in volta gli elementi che si incontrano (come si chiamano, di che tipo sono, che valore contengono, ecc.).

    Quote Originariamente inviata da jabjoint Visualizza il messaggio
    Nel link suggerito si usa switch(qname) che pressuppone di sapere il nome qname.
    E' ovvio. Se tu leggi un file XML, lo fai per leggere i dati che sono all'interno, quindi qualunque sia il motivo o la modalità con cui lo scansioni, se direttamente (parsandolo tutto) oppure progressivamente (con SAX), in qualche modo farai uso dei "nomi delle cose", o per gestirle in un certo modo, o per salvarle, o per farci quello che vuoi.

    Quote Originariamente inviata da jabjoint Visualizza il messaggio
    Inoltre non trovo la possibilità di estrarre tutte le liste ordinate dei nodi di un nodo padre, come ho chiesto.
    Non c'è una "possibilità di estrarre"... c'è una sola e unica lettura di file XML e del suo contenuto, fatta in un modo oppure in un altro, durante la quale sarai tu ad acquisire le informazioni che si trovano nel file e metterle in una lista, in un dizionario, in una coda, una pila, in un database o dove vuoi.

    Non devi pensare a come erroneamente le cose debbano funzionare e chiedere perché non funzionano come credi, ma al contrario devi capire come funzionano, e da lì come utilizzarle per fare ciò che ti serve.

    Un file XML è solo un file di testo. E' come avere un CSV: puoi decidere di leggerlo tutto e di posizionarti alla riga X, oppure di leggere riga per riga e decidere cosa farne di volta in volta in base a quello che ci trovi dentro. L'XML è uguale, solo che al posto delle righe ci sono elementi, ma le procedure sono analoghe. Dove poi metti i dati, è un'altra questione. Quello che ne fai dei nomi degli elementi e/o dei valori contenuti è un'altra questione ancora. Questo è il codice che dovrai scrivere interfacciandoti con la classe che, nel modo più congeniale, ti consente di esplorare il documento XML di riferimento. Non ci sono altre questioni.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  8. #8
    Quote Originariamente inviata da alka Visualizza il messaggio
    Scusa, ma che vuol dire questo?

    Un file XML è composto da elementi, attributi e valori: se lo leggi, è per acquisire queste informazioni!

    Puoi procedere leggendo elementi specifici per nome o in base alla posizione, ad esempio usando XPath, presupponendo di sapere già dove si trovano le informazioni che ti interessano, allo stesso modo con cui si andrebbe a navigare in un file system spostandosi in una directory precisa, indicata per nome, e poi in una sottodirectory, sempre per nome, e indirizzando uno specifico file, per fare una analogia.

    Oppure, usando l'approccio SAX, si legge il file progressivamente, individuando i nodi che lo compongono, che di volta in volta sono elementi, attributi, valori, ancora elementi, attributi, valori, spazi, commenti... dipende dalla configurazione. In sostanza, non si indirizzano elementi specifici, come con XPath, ma ci si lascia guidare dalla struttura del file che viene progressivamente scansionato dicendoci di volta in volta gli elementi che si incontrano (come si chiamano, di che tipo sono, che valore contengono, ecc.).


    E' ovvio. Se tu leggi un file XML, lo fai per leggere i dati che sono all'interno, quindi qualunque sia il motivo o la modalità con cui lo scansioni, se direttamente (parsandolo tutto) oppure progressivamente (con SAX), in qualche modo farai uso dei "nomi delle cose", o per gestirle in un certo modo, o per salvarle, o per farci quello che vuoi.


    Non c'è una "possibilità di estrarre"... c'è una sola e unica lettura di file XML e del suo contenuto, fatta in un modo oppure in un altro, durante la quale sarai tu ad acquisire le informazioni che si trovano nel file e metterle in una lista, in un dizionario, in una coda, una pila, in un database o dove vuoi.

    Non devi pensare a come erroneamente le cose debbano funzionare e chiedere perché non funzionano come credi, ma al contrario devi capire come funzionano, e da lì come utilizzarle per fare ciò che ti serve.

    Un file XML è solo un file di testo. E' come avere un CSV: puoi decidere di leggerlo tutto e di posizionarti alla riga X, oppure di leggere riga per riga e decidere cosa farne di volta in volta in base a quello che ci trovi dentro. L'XML è uguale, solo che al posto delle righe ci sono elementi, ma le procedure sono analoghe. Dove poi metti i dati, è un'altra questione. Quello che ne fai dei nomi degli elementi e/o dei valori contenuti è un'altra questione ancora. Questo è il codice che dovrai scrivere interfacciandoti con la classe che, nel modo più congeniale, ti consente di esplorare il documento XML di riferimento. Non ci sono altre questioni.

    Diciamo che mi sa che continuo a usare DOM.
    Ho capito come funziona SAX, ripeto non conosco i nomi dei tag. O meglio li conosco ma non mi metto a specificarli tutti.
    Può darsi che l'agoritmo che ho proposto non sia ottimale ma quantomeno è in grado di parsare il file nel modo che ho richiesto. Non ha senso per me leggere semplicemente il file XML, è richiesto un ordine.
    Risulta più complesso specificare tutte le classi, che non mi occorrono perché uso una classe che le ingloba tutte.
    SAX è ottimo per carità ma per altro.
    Ultima modifica di jabjoint; 28-03-2025 a 20:10
    jabjoint

  9. #9
    Quote Originariamente inviata da alka Visualizza il messaggio
    Mi sembra un sistema alquanto inefficiente, soprattutto avendo a disposizione linguaggi (e relative strutture in memoria) di alto livello, visto che continui a scandire e rileggere comunque nodi che hai già elaborato, per caricarli oppure per saltarli.

    In aggiunta, è inutilmente farraginoso: non esiste una motivazione per cui uno dovrebbe fare una cosa del genere, potendosi caricare in memoria i dati in una struttura gerarchica.


    Non si capiscono i motivi per cui si dovrebbe fare una simile navigazione nel file, navigando quello che è un albero ripetute volte.

    Per la lettura del file senza determinare a priori il nome dei tag e leggendolo progressivamente, è già prevista la modalità SAX.

    In sintesi, qualunque cosa tu voglia fare con XML, esiste già una implementazione: se non esiste quella che vuoi fare tu, significa che quello che vuoi fare è meno efficiente o utile di quanto non sia già reso disponibile.


    Forse era meglio postare nel forum di Java, visto che si parla di questo linguaggio e non specificatamente di un problema col formato XML in sé, quanto più di modi per leggero scrivendo codice (in Java, in questo caso).
    Può darsi che potrebbe discorsivamente spiegare come potrei fare.
    jabjoint

  10. #10
    non conosco Java - anche se tutto il mio team lo usa, ma per me è una fortuna! - per cui ho chiesto a ChatGPT (la richiesta di jabjoint non mi pare così sballata)

    ---------------------------------------------

    Below is one approach that uses a DOM parser and recursion to walk through every node regardless of the structure. For each node, we build a string that represents the full hierarchy (for example, "root/child/grandchild") and then extract the node’s text value. Finally, you can use JDBC (or your favorite ORM) to insert the hierarchy string and value into your database.
    Below is a sample code snippet:

    codice:
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;
    
    
    public class XMLParser {
    
    
        public static void main(String[] args) {
            try {
                // Parse the XML document from a file or input stream.
                DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                DocumentBuilder builder = factory.newDocumentBuilder();
                Document doc = builder.parse("yourfile.xml"); // replace with your XML source
    
    
                // Normalize XML structure; it's important for parsing text nodes.
                doc.getDocumentElement().normalize();
    
    
                // Start processing from the root element.
                Element root = doc.getDocumentElement();
                traverseNode(root, root.getNodeName());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    
        /**
         * Recursively traverse the XML nodes.
         * @param node the current node being processed
         * @param hierarchy the current path (e.g., "root/child")
         */
        private static void traverseNode(Node node, String hierarchy) {
            // Check if the node has text content that is not just whitespace.
            String value = node.getTextContent().trim();
            if (!value.isEmpty() && node.getChildNodes().getLength() == 1) {
                // Here, you could call a method to insert (hierarchy, value) into your database.
                // For example:
                // insertIntoDB(hierarchy, value);
                System.out.println("Hierarchy: " + hierarchy + " | Value: " + value);
            }
    
    
            // Process each child node recursively.
            NodeList nodeList = node.getChildNodes();
            for (int i = 0; i < nodeList.getLength(); i++) {
                Node child = nodeList.item(i);
                // Only process element nodes.
                if (child.getNodeType() == Node.ELEMENT_NODE) {
                    String childHierarchy = hierarchy + "/" + child.getNodeName();
                    traverseNode(child, childHierarchy);
                }
            }
        }
    
    
        // Example method stub for database insertion.
        /*
        private static void insertIntoDB(String hierarchy, String value) {
            // Setup JDBC connection, create a prepared statement, and execute update.
            // String sql = "INSERT INTO xml_nodes (hierarchy, node_value) VALUES (?, ?)";
        }
        */
    }

    Explanation

    1. Parsing the XML:
      The DocumentBuilderFactory and DocumentBuilder are used to parse the XML document. Once parsed, we normalize the document.

    2. Recursive Traversal:
      The traverseNode method walks through every element. It builds the hierarchy by concatenating parent node names with the current node’s name using a delimiter (here, a forward slash).

    3. Extracting Value:
      For each node, we check if its text content is not just whitespace. You might want to adjust the logic if nodes have mixed content.

    4. Database Insertion:
      The code includes a stub method insertIntoDB where you can implement your JDBC code to store the hierarchy and value into your database.

    This approach works well when you don't know the XML structure ahead of time. You can adjust the logic for handling node values or database interaction based on your specific requirements.




    -------------------------------------------------

    @jabjoint, non mi chiedere di più, che - ripeto - Java non lo conosco!

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.