[Java/XML] List in List uit XML halen

Pagina: 1
Acties:

Onderwerpen


  • Gynnad
  • Registratie: September 2010
  • Nu online
Hallo,

Ik ben bezig om een statistieken programma te maken op basis van XML gegevens. Nu lukt dat eigenlijk vrij aardig en ben ik daar in grote lijnen mee klaar. Natuurlijk wil ik daar mooie toevoegingen aan toevoegen zoals laten zien uit welk land en regio deze komt.

Nu is de XML van world.php een list in een list in een list. een Regio bevat een Land en dat Land bevat een Continent en die Continent staat dan weer in World.

Het XML ziet er als volgt uit (heb het alleen even voor Italie gepakt, anders wordt het zolang)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<maxi-xml>
<continent id="1" name="Europe">
<nation id="1" name="Italia">
<region id="1" name="Marche"/>
<region id="2" name="Abruzzo"/>
<region id="3" name="Calabria"/>
<region id="4" name="Sardegna"/>
<region id="5" name="Sicilia"/>
<region id="6" name="Basilicata"/>
<region id="7" name="Puglia"/>
<region id="8" name="Veneto"/>
<region id="9" name="Liguria"/>
<region id="10" name="Friuli-Venezia Giulia"/>
<region id="11" name="Lombardia"/>
<region id="12" name="Umbria"/>
<region id="13" name="Toscana"/>
<region id="14" name="Piemonte"/>
<region id="15" name="Valle d'Aosta"/>
<region id="16" name="Trentino-Alto Adige"/>
<region id="17" name="Lazio"/>
<region id="18" name="Campania"/>
<region id="19" name="Emilia-Romagna"/>
<region id="20" name="Molise"/>
</nation>
</continent>
</maxi-xml>


Nu kwam ik zelf tot deze code, maar dat is kennelijk niet de logica hoe het moet, als ik op google zoek kom ik er ook niet achter hoe het werkt. Waarschijnlijk zit het niet heel erg moeilijk in elkaar, maar ik kom er maar niet uit.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
    public void zetWorldDataOm() {
        try {
//Hij haalt de data eerst via een andere methode op van de website, waarna hij hem wegschrijft naar xml/world.php, deze haalt hij hierop.
            File fXmlFile = new File("xml/world.xml");
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(fXmlFile);
            doc.getDocumentElement().normalize();

            System.out.println("Root element :" + doc.getDocumentElement().getNodeName());
            NodeList nList = doc.getElementsByTagName("maxi-xml");
            System.out.println("-----------------------");

            for (int temp = 0; temp < nList.getLength(); temp++) {

                Node nNode = nList.item(temp);
                if (nNode.getNodeType() == Node.ELEMENT_NODE) {

                    Element eElement = (Element) nNode;


                    List<World> world = new ArrayList<World>();

                    System.out.println("continent : " + getTagValue("continent", eElement));
                    String continent = getTagValue("continent", eElement);
                    nList = doc.getElementsByTagName("continent");
                    System.out.println("Nation : " + getTagValue("nation", eElement));
                    String nation = getTagValue("nation", eElement);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            //return null;
        }
        //return null;
    }


Wie o wie kan mij uit de brand helpen :?

"Don't worry, about a thing, Cause every little thing is gonna be alright"


  • Creepy
  • Registratie: Juni 2001
  • Nu online

Creepy

Tactical Espionage Splatterer

Wat werkt er nu precies niet? Wat heb je zelf nog geprobeerd om het beter te krijgen? Als je een debugger erbij pakt dan zou je moeten opvallen dat die getElementsByTagName("maxi-xml") een lijst met maar 1 item teruggeeft. Alleen het elemement met de tag maxi-xml. Wat je verder in de code doet is me echt een raadsel. nList aanpassen/vervangen in dezelfde loop waar je al over de items van nList loopt is natuurlijk niet handig. Schrijf eens rustig op hoe je dit denkt uit te lezen en zet het dan eens om naar code.

Iets als dit uitlezen is echt niet zo heel moeilijk als je even rustig nadenkt, en eens bekijkt wat voor meer methodes je hebt dan alleen maar getElementsBytagName zoals methodes om door alle child nodes heen te loopen.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Gynnad
  • Registratie: September 2010
  • Nu online
Heb even nog wat uitgeprobeerd maar er is iets wat niet klopt, heb gegoogled naar een soort gelijk voorbeeld, maar dacht laten we eerst bij de basis beginnen en dat Continent er vast uithalen. Dit wilde ik als volgt doen:

zetWorldDataOm() methode
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
    public void zetWorldDataOm() {
        try {

            File fXmlFile = new File("xml/world.xml");
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(fXmlFile);
            doc.getDocumentElement().normalize();
            
            
        Element docEle = doc.getDocumentElement();
            System.out.println(docEle.getBaseURI());
            System.out.println(docEle.getLocalName());
            System.out.println(docEle.getNamespaceURI());
            System.out.println(docEle.getNodeName());
            System.out.println(docEle.getNodeValue());
            System.out.println(docEle.getPrefix());
            System.out.println(docEle.getTagName());
            System.out.println(docEle.getTextContent());
            System.out.println(docEle.toString());
            System.out.println("-------------------");
            System.out.println(doc.getDocumentURI());
            System.out.println(doc.getLastChild().toString());
            System.out.println(doc.toString());
            
        //get a nodelist of elements
        NodeList nl = docEle.getElementsByTagName("continent");
        if(nl != null && nl.getLength() > 0) {
            for(int i = 0 ; i < nl.getLength();i++) {

                //get the continent element
                Element el = (Element)nl.item(i);

                //get the continent object
                Continent e = getContinent(el);
            }
        }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Uitkomst van de System.out.println();
file:/C:/Users/Danny/Desktop/Maxato/xml/world.xml
null
null
maxi-xml
null
null
maxi-xml
[maxi-xml: null]
-------------------
file:/C:/Users/Danny/Desktop/Maxato/xml/world.xml
[maxi-xml: null]
[#document: null]

getContinent(Element el)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
private Continent getContinent(Element eElement) {
        String continentNaam = getTextValue(eElement,"name");
        int id = getIntValue(eElement,"id");

        //Create a new continent with the value read from the xml nodes
        Continent c = new Continent(id, continentNaam, null);
        System.out.println("ContinentId: "+ c.getContinentId() +" Continentnaam: "+ c.getContinentNaam());
        return c;
    }

/**
     * I take a xml element and the tag name, look for the tag and get
     * the text content
     * i.e for <employee><name>John</name></employee> xml snippet if
     * the Element points to employee node and tagName is 'name' I will return John
     */
    private String getTextValue(Element ele, String tagName) {
        String textVal = null;
        NodeList nl = ele.getElementsByTagName(tagName);
        if(nl != null && nl.getLength() > 0) {
            Element el = (Element)nl.item(0);
            textVal = el.getFirstChild().getNodeValue();
        }
        return textVal;
    }


    /**
     * Calls getTextValue and returns a int value
     */
    private int getIntValue(Element ele, String tagName) {
        //in production application you would catch the exception
        return Integer.parseInt(getTextValue(ele,tagName));
    }


Nou gaat het fout in de methode getContinent(Element el) bij int id = getIntValue(eElement,"id"); Maar ook de String continentNaam blijft leeg in die methode. Dus er gaat iets fout maar ik snap niet zo goed wat ik fout doe.

Voorbeeld wat ik heb gebruikt: http://www.java-samples.com/showtutorial.php?tutorialid=152

Als ik met debuggen kijk en zijn de values ook gewoon null.

"Don't worry, about a thing, Cause every little thing is gonna be alright"


  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 20-09 00:06
In plaats van met de DOM te werken kan je beter JAXB gebruiken, dit is veel simpeler. Onderstaand een heel erg versimpeld voorbeeld, normaal maak je losse classes en nette getters/setters, maar ter illustratie:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package test;

import java.io.File;
import java.util.List;
import javax.xml.bind.annotation.*;
import javax.xml.bind.*;

public class Main {

    public static void main(String[] args) throws JAXBException {
        JAXBContext ctx = JAXBContext.newInstance(World.class);
        World world = (World)ctx.createUnmarshaller().unmarshal(new File("world.xml"));

        System.out.printf("Continents: %d\n", world.continents.size());
        for(Continent c: world.continents) {
            System.out.printf(" -> Continent \"%s\" has %d nations\n",
                    c.name,
                    c.nations.size()
            );
            for(Nation n: c.nations) {
                System.out.printf("    -> Nation \"%s\" has %d regions\n",
                        n.name,
                        n.regions.size()
                );
            }
        }
    }

    static abstract class LokatieBase {
        @XmlAttribute int id;
        @XmlAttribute String name;
    }

    @XmlRootElement(name="maxi-xml")
    static class World {
        @XmlElement(name = "continent")
        List<Continent> continents;
    }

    static class Continent extends LokatieBase {
        @XmlElement(name="nation")
        List<Nation> nations;
    }

    static class Nation extends LokatieBase {
        @XmlElement(name="region")
        List<Region> regions;
    }

    static class Region extends LokatieBase {}
}


Output:
Continents: 1
 -> Continent "Europe" has 1 nations
    -> Nation "Italia" has 20 regions

Acties:
  • 0 Henk 'm!

  • Gynnad
  • Registratie: September 2010
  • Nu online
Bedankt matthijsln, hiermee ben ik er uitgekomen. De code is nu als volgt, en de Classes zijn aangepast zoals hierboven beschreven.:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
    public World worldDataOmzetten() {
        List<domain.Continent> continenten = new ArrayList<domain.Continent>();
        List<Regio> regios = new ArrayList<Regio>();
        List<Nation> landen = new ArrayList<Nation>();
        Continent continent = null;
        Nation nation = null;

        try {
            JAXBContext ctx = JAXBContext.newInstance(World.class);
            World world = (World) ctx.createUnmarshaller().unmarshal(new File("xml/world.xml"));

            for (domain.Continent c : world.getContinent()) {
                for (Nation n : c.getNationsList()) {
                    for (Regio r : n.getRegiosList()) {
                        Regio regio = new Regio(r.getIdRegio(), r.getNameRegio());
                        regios.add(regio);
                    }
                    nation = new Nation(regios, n.getIdNation(), n.getNameNation());
                    landen.add(nation);
                }
                continent = new Continent(landen, c.getIdContinent(), c.getNameContinent());
                continenten.add(continent);
            }
        } catch (JAXBException ex) {
            Logger.getLogger(test.class.getName()).log(Level.SEVERE, null, ex);
        }
        return new World(continenten);
    }


Topic kan gesloten worden.

"Don't worry, about a thing, Cause every little thing is gonna be alright"


Acties:
  • 0 Henk 'm!

  • Gynnad
  • Registratie: September 2010
  • Nu online
Nu heb ik er een Executable Jar van gemaakt, maar doet de methode het nog wel in Netbeans maar niet als executable jar file. Als ik daar in een pop-up venster de lengte van de lijst met continenten wil zien dan staat deze op 0. Terwijl die het in netbeans wel gewoon doet.

Waar kan dit aan liggen?

"Don't worry, about a thing, Cause every little thing is gonna be alright"


  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
Wat heb je zelf al geprobeerd om je probleem op te lossen? Logging output bekeken? System.out.printlns toegevoegd?

Wat betekent new File("xml/world.xml") in de context van een jar file?

[ Voor 24% gewijzigd door Herko_ter_Horst op 17-09-2011 12:36 ]

"Any sufficiently advanced technology is indistinguishable from magic."


  • Gynnad
  • Registratie: September 2010
  • Nu online
Herko_ter_Horst schreef op zaterdag 17 september 2011 @ 12:32:
Wat heb je zelf al geprobeerd om je probleem op te lossen? Logging output bekeken? System.out.printlns toegevoegd?

Wat betekent new File("xml/world.xml") in de context van een jar file?
Die new File("xml/world.xml") wordt meerdere keren gebruikt, ook met andere xml files, waarbij het bij de andere xml files wel goed gaat.

Ik heb inderdaad println's toegevoegd, in Netbeans komt er gewoon keurig het juiste antwoord te staan, maar als ik ze uitlees met pop-up vensters is de lijst gewoon leeg. / null

In Netbeans werkt het allemaal perfect, helemaal gedebugged en ik zie er geen fout in. Maar eenmaal een .jar van gemaakt werkt het niet meer helemaal juist, zoals het in Netbeans wel deed.

"Don't worry, about a thing, Cause every little thing is gonna be alright"


  • Erik Jan
  • Registratie: Juni 1999
  • Niet online

Erik Jan

Langzaam en zeker

Is de lijst leeg, of null? Dat zijn twee verschillende dingen.

Als bovenstaande code een JAXBException oplevert, krijg je inderdaad een World met een lege lijst van continenten terug. Heb je de Logger.getLogger().log() gewoon zo laten staan? Hoe is je log configuratie?

This can no longer be ignored.


Acties:
  • 0 Henk 'm!

  • Gynnad
  • Registratie: September 2010
  • Nu online
Erik Jan schreef op zaterdag 17 september 2011 @ 14:11:
Is de lijst leeg, of null? Dat zijn twee verschillende dingen.

Als bovenstaande code een JAXBException oplevert, krijg je inderdaad een World met een lege lijst van continenten terug. Heb je de Logger.getLogger().log() gewoon zo laten staan? Hoe is je log configuratie?
De lijst van world is gewoon leeg, heb met log nog niet zoveel ervaring, maar ben het nou een beetje aan het uitzoeken.

Heb nu dit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
private final static Logger LOGGER = Logger.getLogger(XmlDataVerwerken.class .getName());
        public void writeLog() {
        try {
            FileHandler fh = new FileHandler("MyLogFile.log", true);
     LOGGER.addHandler(fh);
     LOGGER.setLevel(Level.ALL);
     SimpleFormatter formatter = new SimpleFormatter();
     fh.setFormatter(formatter);    
           // the following statement is used to log any messages   

           // Set the LogLevel to Severe, only severe Messages will be written
               LOGGER.setLevel(Level.SEVERE);
               LOGGER.severe("Info Log");
               LOGGER.warning("Info Log");
               LOGGER.info("Info Log");
               LOGGER.finest("Really not important");

               // Set the LogLevel to Info, severe, warning and info will be written
               // Finest is still not written
               LOGGER.setLevel(Level.INFO);
               LOGGER.severe("Info Log");
               LOGGER.warning("Info Log");
               LOGGER.info("Info Log");
               LOGGER.finest("Really not important");
        } catch (IOException ex) {
            Logger.getLogger(XmlDataVerwerken.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SecurityException ex) {
            Logger.getLogger(XmlDataVerwerken.class.getName()).log(Level.SEVERE, null, ex);
        }
    }


En deze methode roep ik dan aan het einde van de methode aan waar eigenlijk een volle lijst terug zou moeten komen, maar die dus leeg is.

18-sep-2011 18:39:24 connection.XmlDataVerwerken writeLog
WARNING: My first log
18-sep-2011 18:42:34 connection.XmlDataVerwerken writeLog
SEVERE: Info Log
18-sep-2011 18:42:34 connection.XmlDataVerwerken writeLog
SEVERE: Info Log
18-sep-2011 18:42:34 connection.XmlDataVerwerken writeLog
WARNING: Info Log
18-sep-2011 18:42:34 connection.XmlDataVerwerken writeLog
INFO: Info Log

Dat krijg ik terug, maar waarschijnlijk doe ik nog iets fout met de logger, dus nog even verder uitzoeken!

"Don't worry, about a thing, Cause every little thing is gonna be alright"


Acties:
  • 0 Henk 'm!

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
En nu nog in je echte code loggen om te controleren of wat je verwacht als input/output te krijgen ook echt zo is. Bestaat de file die je wilt inlezen? Kan er een inputstream/reader op geopend worden? Etc, etc. Als je je nog even niet druk wilt maken over het gebruik van de logger, kun je ook System.out.println() gebruiken, die je later omzet naar logging (of weggooit).

Zie ook: Programming FAQ - Algemeen

[ Voor 36% gewijzigd door Herko_ter_Horst op 19-09-2011 00:17 ]

"Any sufficiently advanced technology is indistinguishable from magic."


Acties:
  • 0 Henk 'm!

  • Erik Jan
  • Registratie: Juni 1999
  • Niet online

Erik Jan

Langzaam en zeker

Precies, mijn bedoeling was niet om je gelijk over te laten schakelen naar het wellicht wat topzware log4j. Alleen maar om aan te geven dat die code (automatisch gegenereerd door Netbeans) waarschijnlijk de reden was, dat de JAXBException in het niets verdween.

This can no longer be ignored.


Acties:
  • 0 Henk 'm!

  • Gynnad
  • Registratie: September 2010
  • Nu online
Heb gevonden waar de fout zit, nog even wat testen uitvoeren en even kijken hoe ik het moet oplossen. Alleen de server waar ik de XML-bestanden vanaf haalt werkt momenteel niet helemaal mee.. Erg slechte verbinding/offline halve tijd :(

Maar het gaat om de volgende methodes, als ik ze in Netbeans run schrijft hij het XML wel gewoon goed weg, maar doe ik het via het .jar bestand starten dat schrijft het programma de XML-file foutief weg. Ik denk dat het er mee te maken heeft dat hij sommige karakters verkeerd wegschrijft, want volgens mij zijn de methodes wel gewoon goed:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
 public void getDataAthletes(String cookie) {
        try {
            URL anotherUrl = new URL("http://www.maxithlon.com/maxi-xml/athletes.php");
            URLConnection connection = anotherUrl.openConnection();
            connection.setRequestProperty("Cookie", cookie);
            BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String lineRead = "";
            // Read all available lines of data from the URL and print them to screen.
            String alltekst = "";
            while ((lineRead = reader.readLine()) != null) {
                //System.out.println(lineRead);
                alltekst = alltekst + lineRead;
            }
            DateFormat dateFormat = new SimpleDateFormat("MM-dd-yyyy");
            java.util.Date date = new java.util.Date();
            FileOutputStream fos = new FileOutputStream("xml/athletes/" + dateFormat.format(date) + ".xml");
            new PrintStream(fos).println(alltekst);
            reader.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    
        public void getDataWorld(String cookie) {
        try {
            URL anotherUrl = new URL("http://www.maxithlon.com/maxi-xml/world.php");
            URLConnection connection = anotherUrl.openConnection();
            connection.setRequestProperty("Cookie", cookie);
            BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String lineRead = "";
            // Read all available lines of data from the URL and print them to screen.
            String alltekst = "";
            while ((lineRead = reader.readLine()) != null) {
                //System.out.println(lineRead);
                alltekst = alltekst + lineRead;
            }
            FileOutputStream fos = new FileOutputStream("xml/world.xml");
            new PrintStream(fos).println(alltekst);
            reader.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
       
    }


Download hier een foutieve file: http://www.2shared.com/document/NsT2pYNJ/09-20-2011.html

Er staat bij mij als ik hem open in firefox fout in:
XML-parsefout: onjuist gevormd
Locatie: file:///C:/Users/Danny/Desktop/xml/athletes/09-18-2011.xml
Regelnummer 1, kolom 1896:

Weet niet of iemand een handige manier weet om snel bij dat kolom te komen?

"Don't worry, about a thing, Cause every little thing is gonna be alright"


Acties:
  • 0 Henk 'm!

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
Als eerste is er de vraag waarom je twee keer dezelfde code hebt geschreven voor het ophalen van twee files.

Vervolgens is er de vraag waarom je PrintStreams, Readers en conversie naar String gebruikt, terwijl je gewoon een file wilt wegschrijven.

Vervolgens is er nog de vraag waarom je String-concatenatie gebruikt, terwijl je een StringBuilder zou moeten gebruiken.

Als je die vragen hebt beantwoord (en deze twee methodes hebt vervangen door één methode die gewoon op Input- en OutputStreams werkt), zou ik in de rest van je code nog even goed kijken naar het gebruik van PrintStreams en Readers/Writer, met name waar het gaat om het expliciet meegeven van een character set.
Nu ben je overgeleverd aan wat het systeem als default pakt. Grote kans dat dit geen UTF-8 is. Aangezien de XML prolog wel claimt dat het document UTF-8 encoded is, gaat het mis.

http://www.joelonsoftware.com/articles/Unicode.html

[ Voor 104% gewijzigd door Herko_ter_Horst op 20-09-2011 22:46 ]

"Any sufficiently advanced technology is indistinguishable from magic."


Acties:
  • 0 Henk 'm!

  • Gynnad
  • Registratie: September 2010
  • Nu online
Herko_ter_Horst schreef op dinsdag 20 september 2011 @ 22:34:
Als eerste is er de vraag waarom je twee keer dezelfde code hebt geschreven voor het ophalen van twee files.

Vervolgens is er de vraag waarom je PrintStreams, Readers en conversie naar String gebruikt, terwijl je gewoon een file wilt wegschrijven.

Vervolgens is er nog de vraag waarom je String-concatenatie gebruikt, terwijl je een StringBuilder zou moeten gebruiken.

Als je die vragen hebt beantwoord, zou ik in de rest van je code nog even goed kijken naar het gebruik van PrintStreams en Readers/Writer, met name waar het gaat om het expliciet meegeven van een character set.
Nu ben je overgeleverd aan wat het systeem als default pakt. Grote kans dat dit geen UTF-8 is. Aangezien de XML prolog wel claimt dat het document UTF-8 encoded is, gaat het mis.

http://www.joelonsoftware.com/articles/Unicode.html
Hartelijk bedankt! Dat was inderdaad het probleem! _/-\o_

Hoe komt het eigenlijk dat hij binnen Netbeans dit wel juist doet en extern niet?

"Don't worry, about a thing, Cause every little thing is gonna be alright"


Acties:
  • 0 Henk 'm!

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
Gynnad schreef op dinsdag 20 september 2011 @ 22:46:
[...]


Hartelijk bedankt! Dat was inderdaad het probleem! _/-\o_

Hoe komt het eigenlijk dat hij binnen Netbeans dit wel juist doet en extern niet?
Geen idee. Misschien een instelling dat ie UTF-8 als default pakt.

Snap je het andere commentaar dat ik gaf ook?

[ Voor 6% gewijzigd door Herko_ter_Horst op 20-09-2011 22:54 ]

"Any sufficiently advanced technology is indistinguishable from magic."


Acties:
  • 0 Henk 'm!

  • Gynnad
  • Registratie: September 2010
  • Nu online
Herko_ter_Horst ik begreep je andere commentaar ook ;)

Nu zit ik alleen met een ander probleem, en ben al de hele tijd aan het debuggen etc. Maar kom er eigenlijk niet uit. Het is namelijk het volgende, ik heb de volgende XML-file opgehaald (een stukje ervan staat hieronder):

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<maxi-xml>
<season>30</season>
<currentWeek>7</currentWeek>
<calendar index="1">
<day>25</day>
<month>9</month>
<year>2011</year>
</calendar>
<calendar index="2">
<day>2</day>
<month>10</month>
<year>2011</year>
<competition>1</competition>
<competition>2</competition>
<competition>3</competition>
<competition>4</competition>
</calendar>
</maxi-xml>


Nu dacht ik dat via de volgende methode te doen, zoals ze mij ook vertelden hoe ik dat bij de World-methode moest doen, waar dit topic over gaat. Maar het probleem is dat de data wel wordt opgehaald, en deze staat ook in de calendar van de volgende regel:
Calendar calendar = (Calendar) jct.createUnmarshaller().unmarshal(xmlfile);

Maar zo gauw ik het dan ga omzetten wordt alles op 0 gezet. De Calendar telt 20 weken, en er zijn ook 20 items in de list, maar deze worden ook allemaal op 0 gezet.

Methode om XMLfile om te zetten in Calendar
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    public Calendar calendarDataOmzetten() {
        List<Calendar_Week> weken = new ArrayList<Calendar_Week>();
        List<Competition> competities = new ArrayList<Competition>();
        int season = 0;
        int currentWeek = 0;
        try {
            JAXBContext jct = JAXBContext.newInstance(Calendar.class);
            File xmlfile = new File("xml/calendar.xml");
            Calendar calendar = (Calendar) jct.createUnmarshaller().unmarshal(xmlfile);
            season = calendar.getSeasonCalendar();
            currentWeek = calendar.getCurrentWeekCalendar();
            System.out.println(season + " SEASON " + currentWeek);
            for (domain.Calendar_Week c : calendar.getWeeksCalendar()) {
                for (Competition co : c.getCompetitionCalendarWeek()) {
                    competities.add(co);
                }
                Calendar_Week cw = new Calendar_Week(c.getDayCalendarWeek(), c.getMonthCalendarWeek(), c.getDayCalendarWeek(), competities);
                weken.add(cw);
            }
        } catch (Exception ex) {
            Logger.getLogger(XmlDataVerwerken.class.getName()).log(Level.SEVERE, null, ex);
        }
        return new Calendar(season, currentWeek, weken);
    }
}


De domain Classes die ik er voor gebruik zien er als volgt uit, waar in mijn ogen volgens mij de fout in moet zitten.

Calendar.java
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
@XmlRootElement(name = "maxi-xml")
public class Calendar {

    @XmlAttribute(name = "season")
    int season;
    @XmlAttribute(name = "currentWeek")
    int currentWeek;
    @XmlElement(name = "calendar")
    List<Calendar_Week> weeks = new ArrayList<Calendar_Week>();

    public Calendar() {
    }

    public Calendar(int season, int currentWeek, List<Calendar_Week> weeks) {
        this.season = season;
        this.currentWeek = currentWeek;
        this.weeks = weeks;
    }

    public int getCurrentWeekCalendar() {
        return currentWeek;
    }

    public void setCurrentWeekCalendar(int currentWeek) {
        this.currentWeek = currentWeek;
    }

    public int getSeasonCalendar() {
        return season;
    }

    public void setSeasonCalendar(int season) {
        this.season = season;
    }

    public List<Calendar_Week> getWeeksCalendar() {
        return weeks;
    }

    public void setWeeksCalendar(List<Calendar_Week> weeks) {
        this.weeks = weeks;
    }
}


Calendar_Week.java
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
public class Calendar_Week {

    @XmlAttribute
    int day;
    @XmlAttribute
    int month;
    @XmlAttribute
    int year;
    @XmlElement(name = "competition")
    List<Competition> competition = new ArrayList<Competition>();

    public Calendar_Week() {
    }

    public Calendar_Week(int dag, int maand, int jaar, List<Competition> competities) {
        this.day = dag;
        this.month = maand;
        this.year = jaar;
        this.competition = competities;
    }

    public List<Competition> getCompetitionCalendarWeek() {
        return competition;
    }

    public void setCompetitionCalendarWeek(List<Competition> competition) {
        this.competition = competition;
    }

    public int getDayCalendarWeek() {
        return day;
    }

    public void setDayCalendarWeek(int day) {
        this.day = day;
    }

    public int getMonthCalendarWeek() {
        return month;
    }

    public void setMonthCalendarWeek(int month) {
        this.month = month;
    }

    public int getYearCalendarWeek() {
        return year;
    }

    public void setYearCalendarWeek(int year) {
        this.year = year;
    }
}


Competition.java
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Competition {

    @XmlAttribute
    int competitionId;

    public Competition() {
    }

    public Competition(int competitionId) {
        this.competitionId = competitionId;
    }

    public int getCompetitionIdCalendarWeek() {
        return competitionId;
    }

    public void setCompetitionIdCalendarWeek(int competitionId) {
        this.competitionId = competitionId;
    }
}


Ik ben hier al een week mee bezig en waarschijnlijk is het een dom kleinigheidje, maar ik kom er maar niet uit..

"Don't worry, about a thing, Cause every little thing is gonna be alright"


Acties:
  • 0 Henk 'm!

  • Lone Gunman
  • Registratie: Juni 1999
  • Niet online
Het is inderdaad een klein probleempje, je jaxb annotations bij je classes zijn niet correct.
Als je naar de xml kijkt, zijn bv season en currentWeek geen attributes maar elements. De annotation voor bv season (in de Calendar class) moet dan ook @XmlElement zijn ipv @XmlAttribute.

Verder gaat er nog iets mis bij de competition elements, dit zijn gewoon Integers ipv Competition elements, dus List<Competition> in Calendar_Week moet List<Integer> worden. De competition class wordt dan overbodig.

Experience has taught me that interest begets expectation, and expectation begets disappointment, so the key to avoiding disappointment is to avoid interest.


Acties:
  • 0 Henk 'm!

  • Gynnad
  • Registratie: September 2010
  • Nu online
Lone Gunman schreef op dinsdag 08 november 2011 @ 18:56:
Het is inderdaad een klein probleempje, je jaxb annotations bij je classes zijn niet correct.
Als je naar de xml kijkt, zijn bv season en currentWeek geen attributes maar elements. De annotation voor bv season (in de Calendar class) moet dan ook @XmlElement zijn ipv @XmlAttribute.

Verder gaat er nog iets mis bij de competition elements, dit zijn gewoon Integers ipv Competition elements, dus List<Competition> in Calendar_Week moet List<Integer> worden. De competition class wordt dan overbodig.
Dank je wel! Probleem is opgelost en ik snap het nu.

"Don't worry, about a thing, Cause every little thing is gonna be alright"

Pagina: 1