Visualizzazione dei risultati da 1 a 6 su 6

Discussione: Problema con xml child

  1. #1

    Problema con xml child

    ciao!
    ho un problema con un file xml.
    questo una parte del file:
    codice:
    <clienti>
      <cliente>
        <codice>CODICE</codice>
        <ragione_sociale>RAGSOC</ragione_sociale>
        <mnemonico>MNEM</mnemonico>
        <indirizzo>INDIRIZZO</indirizzo>
        <telefono> </telefono>
        <email> </email>
        <listino_c>LIST</listino_c>
        <sconto_c>00.00</sconto_c>
      </cliente>
    ........
    </clienti>
    quindi è completo dei tag.
    poi lo leggo:
    codice:
        public static ArrayList<ArrayList<String>> read(String file) throws ParserConfigurationException, SAXException, IOException {
            ArrayList<ArrayList<String>> tabella = new ArrayList<>();
            if (new File(file).exists()) {
                DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
                DocumentBuilder builder = builderFactory.newDocumentBuilder();
                Document document = builder.parse(file);
                document.getDocumentElement().normalize();
                NodeList nodeList = document.getElementsByTagName("cliente");
                for (int i = 0; i < nodeList.getLength(); i++) {
                    Node node = nodeList.item(i);
                    if (node.getNodeType() == Node.ELEMENT_NODE) {
                        ArrayList<String> list = new ArrayList<>();
                        Element element = (Element) node;
                        list.add(element.getElementsByTagName("codice").item(0).getTextContent());
                        list.add(element.getElementsByTagName("ragione_sociale").item(0).getTextContent());
                        list.add(element.getElementsByTagName("mnemonico").item(0).getTextContent());
                        list.add(element.getElementsByTagName("listino_c").item(0).getTextContent()); // ERRORE
                        tabella.add(list);
                    }
                }
            }
            return tabella;
        }
    ottengo l'errore sulla riga dove ho messo il commento:
    codice:
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at it.cimoda.ReadXml.read(ReadXml.java:40)
        at it.cimoda.FrameMain.riempiTable(FrameMain.java:100)
        at it.cimoda.FrameMain.<init>(FrameMain.java:30)
        at it.cimoda.Cimoda$1.run(Cimoda.java:29)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
        at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:744)
        at java.awt.EventQueue.access$400(EventQueue.java:97)
        at java.awt.EventQueue$3.run(EventQueue.java:697)
        at java.awt.EventQueue$3.run(EventQueue.java:691)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:714)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
    può essere che sia stanco, ma l'errore non lo vedo!!!

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,325
    Sei sicuro che nel file XML non vi sia un "cliente" in cui manca il tag "listino_c"?
    Prova a farti stampare il valore della variabile "i" (il contatore del for), per capire a quale occorrenza va in errore.
    Sinceramente è da parecchio che non uso la API standard per gli XML (uso regolarmente JDom), quindi non ho controllato se vi sono errori semantici nel codice.


    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

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da fermat Visualizza il messaggio
    ottengo l'errore sulla riga dove ho messo il commento:
    [code]
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at it.cimoda.ReadXml.read(ReadXml.java:40)
    Non ho provato il tuo codice (posso farlo se vuoi) ma in linea di massima mi pare corretto, perlomeno il modo di operare è sensato.
    Il codice però è un pochino "fragile": il metodo item non lancia eccezioni se l'indice non esiste ma restituisce un bel null e ovviamente getTextContent() su un null causa il NPE.


    P.S. non so cosa ci devi fare con quel ArrayList di ArrayList di String .... ti suggerirei di modellare i dati del cliente con una apposita classe.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    Sei sicuro che nel file XML non vi sia un "cliente" in cui manca il tag "listino_c"?
    Prova a farti stampare il valore della variabile "i" (il contatore del for), per capire a quale occorrenza va in errore.
    Sinceramente è da parecchio che non uso la API standard per gli XML (uso regolarmente JDom), quindi non ho controllato se vi sono errori semantici nel codice.


    Ciao.
    ciao!

    in effetti hai ragione.
    alcuni clienti non hanno quel tag listino_c.
    considera che questo file xml viene riempito da db, quindi evidentemente manca qualche record.
    come posso ovviare al problema secondo te??

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da fermat Visualizza il messaggio
    come posso ovviare al problema secondo te??
    Semplicemente testando il valore restituito da item(). Visto che lo devi fare diverse volte, puoi anche farti un piccolo metodo di utilità che dato il element e un "sub" tag-name, ti fornisce il testo (se possibile e trovato) oppure null.

    Una cosa tipo es.:

    public static String getFirstSubTagText(Element e, String tagName)
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Semplicemente testando il valore restituito da item(). Visto che lo devi fare diverse volte, puoi anche farti un piccolo metodo di utilità che dato il element e un "sub" tag-name, ti fornisce il testo (se possibile e trovato) oppure null.

    Una cosa tipo es.:

    public static String getFirstSubTagText(Element e, String tagName)
    ciao!

    allora, questo problema l'ho risolto alla radice direttamente in fase di creazione del file xml, mettendo un valore MANCANTE quando il record non c'è.
    così almeno faccio una cosa omogenea per tutte le varie applicazioni (è previsto anche un client in c# e una app android).

    per quanto riguarda il tuo suggerimento precedente, hai ragione.
    prima di fare una apposita di classe, devo capire esattamente quanti campi voglio vedere.
    non volevo fare le cose 200 volte .

    grazie a entrambi!

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.