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

    [Java] Problema lettura file xml

    questo è quello che ho messo su:
    codice:
        public static void read() throws ParserConfigurationException, SAXException, IOException {
            File fXmlFile = new File(System.getProperty("user.home") + "/todo.xml");
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(fXmlFile);
            doc.getDocumentElement().normalize();
    
            NodeList nList = doc.getElementsByTagName("todos");
            for (int temp = 0; temp < nList.getLength(); temp++) {
                Node nNode = nList.item(temp);
                if (nNode.getNodeType() == Node.ELEMENT_NODE) {
                    Element eElement = (Element) nNode;
                    System.out.println("Todo : " + getTagValue("todo", eElement));
                }
            }
        }
    
        private static String getTagValue(String sTag, Element eElement) {
            NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes();
            Node nValue = (Node) nlList.item(0);
            return nValue.getNodeValue();
        }
    
        public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
            read();
        }
    il file xml è questo:
    codice:
    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <todos>
    <todo>yong</todo>
    <todo>yvbx</todo>
    <todo>yobxc</todo>
    <todo>yosdfgsdf</todo>
    </todos>
    il problema è che il metodo mi restituisce solo il mi primo todo.

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    3,660
    se devi recuperare tutti i nodi denominati "todo" non fai prima a recuperarli con getElementsByTagName("todo")? l'xml che hai postato è completo o è solo una parte altrimenti è inutile anche il ciclo for... inoltre quel for cicla i tag todos e quindi il ciclo verrà effettuato una sola volta perche di tag todos c'è ne solo uno.

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Premetto che ho usato solo una volta la libreria standard di Java, solitamente uso JDom.

    Ad ogni modo, il problema credo risieda qui:

    codice:
    NodeList nList = doc.getElementsByTagName("todos");
    for (int temp = 0; temp < nList.getLength(); temp++) {
    La lista conterrà tutti gli elementi di nome "todos"... ovvero 1 solo elemento. Quindi il for effettuerà un solo ciclo.

    Poi, dentro al ciclo hai sicuramente "adattato" la logica per far uscire i dati, senza tenere presente che non stavi scorrendo la lista che credevi, ma quella più esterna.

    Credo che sia più facile estrarre tutti gli elementi "todo" e non "todos", andando a sistemare la logica dentro al for di conseguenza.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    ok ho dato una sistemata al metodo read():
    Todo : null
    Todo : null
    Todo : null
    Todo : null

    questo è il metodo:
    codice:
        public static void read() throws ParserConfigurationException, SAXException, IOException {
            File fXmlFile = new File(System.getProperty("user.home") + "/todo.xml");
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(fXmlFile);
            doc.getDocumentElement().normalize();
    
            NodeList nList = doc.getElementsByTagName("todo");
            for (int temp = 0; temp < nList.getLength(); temp++) {
                Node nNode = nList.item(temp);
                if (nNode.getNodeType() == Node.ELEMENT_NODE) {
                    System.out.println("Todo : " + nNode.getNodeValue());
                }
            }
        }
    in pratica nn risco a leggere il valore del nodo.

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2010
    Messaggi
    3,660
    va che ti stai complicando la vita e pure di molto, ti basta usare questa istruzione nel ciclo:

    codice:
    nList.item(temp).getTextContent()
    E hai recuperato tutti i valori che ti interessano...

  6. #6
    Originariamente inviato da Vindav
    va che ti stai complicando la vita e pure di molto, ti basta usare questa istruzione nel ciclo:

    codice:
    nList.item(temp).getTextContent()
    E hai recuperato tutti i valori che ti interessano...
    grazie così funziona tutto:
    codice:
        public static ArrayList<ToDo> read() throws ParserConfigurationException, SAXException, IOException {
            ArrayList<ToDo> list = new ArrayList<ToDo>();
            File fXmlFile = new File(System.getProperty("user.home") + "/todo.xml");
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(fXmlFile);
            doc.getDocumentElement().normalize();
    
            NodeList nList = doc.getElementsByTagName("todo");
            for (int i = 0; i < nList.getLength(); i++) {
                ToDo td = new ToDo(nList.item(i).getTextContent());
                list.add(td);
            }
            System.out.println(list);
            return list;
        }

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.