# Objekt erzeugen aus einem XML Datei



## XML_Problem (10. Mrz 2012)

Hallo!

Kurz zu meinem Problem:
Ich beziehe aus dem Internet eine XML-Datei. Ich habe dabei eh nur lesenden Zugriff und will/kann also auch keine Manipulation an der Datei vornehmen.
So.

Nachdem ich das XML Dokument gedownloadet habe muss ich Objekte daraus "herausziehen" damit ich diese in meiner GUI verwenden kann.

Eine XML Datei sehe z.B. so aus:

[XML]
<Mannschaft>

<Spieler>
<Vorname>Max</Vorname>
<Nachname>Mustermann</Nachname>
<Position>Mittelfeld</Position>
</Spieler>

<Spieler>
<Vorname>Maxim</Vorname>
<Nachname>Musterfrau</Nachname>
<Position>Torwart</Position>
</Spieler>

</Mannschaft>
[/XML]

Ich bräuchte jetzt also eine Art

```
ArrayList<Spieler> spieler = ArrayList<Spieler>();
```

die sich sich herausgezogenen Spieler aus der XML-Datei in dieser ArrayList merkt.

Welches Wekzeug würdet ihr mir empfehlen?
Bei den ganzen für mich verwirrenden XML Parsern werde ich nicht wirklich schlau. Zumal ich kein vernünftiges Beispiel/Tutorial finden kann für mein Problem.
Zur Erinnerung: Die XML Daten werden nicht weiter bearbeitet. Es sollen nur Objekte daraus erstellt werden.

Vielen Dank schon mal.
Viele Grüße


----------



## ...ButAlive (10. Mrz 2012)

Für dein Anliegen wird JAXB wohl das beste sein. Du musst nur entsprechende Objekte definieren und ein paar Zusatzinformationen annotieren, dann kannst du die XML-Datei ganz einfach auslesen.

Für dein Beispiel sieht das so aus:

Klasse Mannschaft

```
package org.javaforum.jaxb;

import java.util.List;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="Mannschaft")
public class Mannschaft {

	@XmlElement(name="Spieler")
	private List<Spieler> spieler;
	
	public List<Spieler> getSpieler() {
		return spieler;
	}
}
```

Klasse Spieler

```
package org.javaforum.jaxb;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;

@XmlType(name="Spieler")
public class Spieler {

	@XmlElement(name="Vorname")
	private String vorname;
	
	@XmlElement(name="Nachname")
	private String nachname;
	
	@XmlElement(name="Position")
	private String prosition;
	
	
	public String getNachname() {
		return nachname;
	}
	
	public String getProsition() {
		return prosition;
	}
	
	public String getVorname() {
		return vorname;
	}
}
```

Und so sieht der Aufruf dann aus:


```
package org.javaforum.jaxb;

import java.net.URL;
import java.util.List;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;

public class Test {

	public static void main(String[] args) throws JAXBException {
		JAXBContext context = JAXBContext.newInstance(Mannschaft.class, Spieler.class);
		
		Unmarshaller unmarschaller = context.createUnmarshaller();
		
		File file = //Deine Datei
		//alternativ kannst du auch eine URL angeben, dann musst du es nicht erst downloaden.
		Mannschaft mannschaft = (Mannschaft) unmarschaller.unmarshal(file);
		
		List<Spieler> spieler = mannschaft.getSpieler();
		
		
		for (Spieler s : spieler) {
			System.out.println(s.getVorname());
			System.out.println(s.getNachname());
			System.out.println(s.getProsition());
			
			System.out.println("=======================");
		}
	}
}
```

Mehr Informationen findest du zum Beispiel hier: Java ist auch eine Insel


----------



## XML_Problem (10. Mrz 2012)

Hey, danke!
Dein Beispiel hat mir schon mal ein wenig weitergeholfen.

Nun wollte ich dein Beispiel an mein Programm anpassen. Dabei tritt nun noch ein weiteres Problem auf, dass im Zusammenhang mit der Klasse Mannschaft, bzw. dem 
[XML]
@XmlRootElement(name="Mannschaft")
[/XML]
zusammenhängt.

Die XML Datei dich ich downloade sieht so aus:
[XML]
<?xml version="1.0" encoding="utf-8"?>
<HattrickData>
  <FileName>players.xml</FileName>
  <Version>2.2</Version>
  <UserID>xxxxxxx</UserID>
  <FetchedDate>2012-03-10 02:55:54</FetchedDate>
  <UserIsSupporter>0</UserIsSupporter>
  <IsYouth>False</IsYouth>
  <ActionType>view</ActionType>
  <IsPlayingMatch>False</IsPlayingMatch>
<Mannschaft>

<Spieler>
<Vorname>Max</Vorname>
<Nachname>Mustermann</Nachname>
<Position>Mittelfeld</Position>
</Spieler>

<Spieler>
<Vorname>Maxim</Vorname>
<Nachname>Musterfrau</Nachname>
<Position>Torwart</Position>
</Spieler>

</Mannschaft>
</HattrickData>
[/XML]

Ich habe aus diesem Tag
[XML]
@XmlRootElement(name="Mannschaft")
[/XML]
den gemacht. Da sich ja das RootElement geändert hat.
[XML]
@XmlRootElement(name="HattrickData")
[/XML]
.

Nun schmeisst mir das Programm ne Nullpointer...

Ich denke es hat mit den ganzen zusätzlichen Attributen in der XML Datei zu tun, bevor es mit den für mich wichtigen Attributen ab dem Tag
[XML]
<Mannschaft>
<Spieler>
.
.
</Spieler>
.
.
</Mannschaft>
[/XML]

losgeht...
Eine Idee was ich noch einzustellen habe?

Viele Grüße


----------



## BoBoHelp (10. Mrz 2012)

Hallo,
hier ein Vorschlag:

EINE JAVA-CLASS: HattrickDataType.java


```
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "HattrickDataType", propOrder = {
    "fileName",
    "version",
    "userID",
    "fetchedDate",
    "userIsSupporter",
    "isYouth",
    "actionType",
    "isPlayingMatch",
    "mannschaft"
})
public class HattrickDataType {

    @XmlElement(name = "FileName", required = true)
    protected String fileName;
    @XmlElement(name = "Version", required = true)
    protected String version;
    @XmlElement(name = "UserID", required = true)
    protected String userID;
    @XmlElement(name = "FetchedDate", required = true)
    protected String fetchedDate;
    @XmlElement(name = "UserIsSupporter", required = true)
    protected String userIsSupporter;
    @XmlElement(name = "IsYouth", required = true)
    protected String isYouth;
    @XmlElement(name = "ActionType", required = true)
    protected String actionType;
    @XmlElement(name = "IsPlayingMatch", required = true)
    protected String isPlayingMatch;
    @XmlElement(name = "Mannschaft", required = true)
    protected MannschaftType mannschaft;

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String value) {
        this.fileName = value;
    }

    public String getVersion() {
        return version;
    }

    public void setVersion(String value) {
        this.version = value;
    }

    public String getUserID() {
        return userID;
    }

    public void setUserID(String value) {
        this.userID = value;
    }

    public String getFetchedDate() {
        return fetchedDate;
    }

    public void setFetchedDate(String value) {
        this.fetchedDate = value;
    }

    public String getUserIsSupporter() {
        return userIsSupporter;
    }

    public void setUserIsSupporter(String value) {
        this.userIsSupporter = value;
    }

    public String getIsYouth() {
        return isYouth;
    }

    public void setIsYouth(String value) {
        this.isYouth = value;
    }

    public String getActionType() {
        return actionType;
    }

    public void setActionType(String value) {
        this.actionType = value;
    }

    public String getIsPlayingMatch() {
        return isPlayingMatch;
    }

    public void setIsPlayingMatch(String value) {
        this.isPlayingMatch = value;
    }

    public MannschaftType getMannschaft() {
        return mannschaft;
    }

    public void setMannschaft(MannschaftType value) {
        this.mannschaft = value;
    }

}
```

JAVA-CLASS: MannschaftType.java


```
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "MannschaftType", propOrder = {
    "spieler"
})
public class MannschaftType {

    @XmlElement(name = "Spieler")
    protected List<SpielerType> spieler;

    public List<SpielerType> getSpieler() {
        if (spieler == null) {
            spieler = new ArrayList<SpielerType>();
        }
        return this.spieler;
    }

}
```

SpielerType.java



```
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "SpielerType", propOrder = {
    "vorname",
    "nachname",
    "position"
})
public class SpielerType {

    @XmlElement(name = "Vorname", required = true)
    protected String vorname;
    @XmlElement(name = "Nachname", required = true)
    protected String nachname;
    @XmlElement(name = "Position", required = true)
    protected String position;

    public String getVorname() {
        return vorname;
    }

    public void setVorname(String value) {
        this.vorname = value;
    }

    public String getNachname() {
        return nachname;
    }

    public void setNachname(String value) {
        this.nachname = value;
    }

    public String getPosition() {
        return position;
    }

    public void setPosition(String value) {
        this.position = value;
    }

}
```

DAZU NOCH OBJECTFACTORY:


```
@XmlRegistry
public class ObjectFactory {

    private final static QName _HattrickData_QNAME = new QName("", "HattrickData");

    public ObjectFactory() {
    }

    public HattrickDataType createHattrickDataType() {
        return new HattrickDataType();
    }

    public SpielerType createSpielerType() {
        return new SpielerType();
    }

    public MannschaftType createMannschaftType() {
        return new MannschaftType();
    }

    @XmlElementDecl(namespace = "", name = "HattrickData")
    public JAXBElement<HattrickDataType> createHattrickData(HattrickDataType value) {
        return new JAXBElement<HattrickDataType>(_HattrickData_QNAME, HattrickDataType.class, null, value);
    }

}
```

Fertig.


----------



## ...ButAlive (10. Mrz 2012)

Das was BoBoHelp gepostet hat kommt raus, wenn man sich das aus einem XSD/DDT generieren lässt. Das geht natürlich auch. Es geht aber auch kürzer:


```
package org.javaforum.jaxb;

import java.util.List;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="HattrickData")
public class HattrickData {

	@XmlElementWrapper(name="Mannschaft")
	@XmlElement(name="Spieler")
	private List<Spieler> spieler;
	
	public List<Spieler> getSpieler() {
		return spieler;
	}
}
```

Wenn du an die Liste der Spieler noch 
	
	
	
	





```
@XmlElementWrapper(name="Mannschaft")
```
 schreibst, kannst du dir die Zwischenklasse "Mannschaft" sparen. Ich habe die anderen Elemente von HattrickData mal weggelassen. Falls du sie brauchst musst du sie einfach als Felder hinzufügen und mit 
	
	
	
	





```
@XMLElement
```
 entsprechend annotieren.

Die Klasse Spieler bleibt wie gehabt.


----------



## XML_Problem (10. Mrz 2012)

Hey Vielen Dank schon mal für eure Postings.


@...ButAlive
Also ich habe deine Anpassung einmal am Dummy Programm (also dein gepostetest) getestet. Läuft einwandfrei...
Dann habe ich versucht es auch an meinem Programm anzupassen und es bleibt bei der Null Pointer Exception.

Geworfen wird die Exception an der Stelle wo die Zuweisung per unmarshalling an das Objekt erfolgen soll:

Mein unmarshalling sieht folgendermaßen aus, 

```
All_Players all_players = (All_Players) unmarschaller.unmarshal(new InputStreamReader(new FileInputStream(file), "ISO-8859-1"));
```
da ich, wenn ich die folgende Form nehmen würde:


```
All_Players all_players = (All_Players) unmarschaller.unmarshal(file);
```

diese Exception bekommen würde.
Habe schon herausgefunden, dass es angeblich an JAXB und dem UTF-8 Format liegen soll. Daher habe ich explizit die Datei noch mal im "ISO-8859-1" Encoding eingelesen. Diese untere Exception konnte ich damit beheben.
(Es erscheint trotzdem alles sehr seltsam, da ja das Dummyprogramm mit einer XML Datei im UTF-8 auch geht)


```
javax.xml.bind.UnmarshalException
 - with linked exception:
[com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Ungültiges Byte 2 von 3-Byte-UTF-8-Sequenz.]
	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(Unknown Source)
	at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(Unknown Source)
	at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown Source)
	at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown Source)
	at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown Source)
	at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown Source)
	at HTSmart.getPlayers(HTSmart.java:84)
	at HTSmart.<init>(HTSmart.java:36)
	at FirstStart.validateAccess(FirstStart.java:169)
	at FirstStart.<init>(FirstStart.java:52)
	at FirstStart.main(FirstStart.java:185)
Caused by: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Ungültiges Byte 2 von 3-Byte-UTF-8-Sequenz.
	at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.scanContent(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
	... 11 more
```

Interessant ist, dass die Datei die ich downloade ebenso wie meine TestXML Datei im XML Kopf das hier
[XML]
<?xml version="1.0" encoding="utf-8"?>
[/XML]

stehen hat. Nur dass das Dummyprogramm mit der selber erzeugten XML Datei im UTF-8 Format geht und die gedownloadete die auch im XML UTF-8 Format vorliegt eben nicht, da die sonst obige Exception schmeisst.

Ich bin echt ratlos, was dieses Problem angeht.

Vielleicht sei an der Stelle noch erwähnt, dass ich an das XML Dokument aus dem Netz mit Hilfe einer FreeLicense-API gelange.

Die API liefert mir nur den Inhalt der ganzen XML-Datei, so dass ich mit folgender Methode mir mein eigenes XML File daraus speichern muss.:

```
public void writePlayersToXML() {
		try {
			File f = new File("XML/players_result.xml");
			BufferedWriter out = new BufferedWriter(
					  new OutputStreamWriter(new FileOutputStream(f)));
			
			out.write(response_Players.getBody()); // das ist die Methode aus der API die mir den gesamten Inhalt als String aus dem XML Dokument liefert
			out.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
```


Ich hab gerade noch nachgelesen, dass die API diesen String als UTF-8 endcodeten String zurück liefert.

Ist hier vielleicht der Fehler? Muss ich noch irgend etwas beachten beim erstellen der eigenen XML-Datei bzw. verändere ich vielleicht das Coding damit und mache es deshalb vielleicht nicht mehr lesbar für JAXB?


----------



## XML_Problem (11. Mrz 2012)

Hat keiner mehr ne Ahnung? 
Hehe... Ich hab mir schon gedacht, dass das hier so langsam zu einem sehr speziellen Problem wird.
Dennoch bin ich weiterhin für jede Hilfe dankbar.


----------



## Marcinek (11. Mrz 2012)

Ersetzte mal hierdurch:

[XML]<?xml version = "1.0" encoding = "ISO-8859-1" ?>[/XML]


----------



## XML_Problem (11. Mrz 2012)

Ok also ich bin mit meinem Latein am Ende...
Ich danke für die bereits geposteten Hilfestellungen, aber leider konnte ich zu keinem positiven Ergebnis kommen.
Ich stelle hier nun mal meinen Code ein.
Es wäre nett wenn sich jemand das Problem anschauen könnte.

Klasse All_Players:

```
@XmlRootElement(name="HattrickData")
public class All_Players {

	@XmlElementWrapper(name = "Team")
	@XmlElement(name = "Player")
	private List<Player> players;

	public List<Player> getPlayers() {
		return players;
	}
}
```

Klasse Player:

```
@XmlType(name="Player")
public class Player {

	@XmlElement(name = "PlayerID")
	private String player_ID;
	
	@XmlElement(name = "FirstName")
	private String player_FirstName;
	
	@XmlElement(name = "Lastname")
	private String player_NickName;
	
	@XmlElement(name = "NickName")
	private String player_LastName;
	
	@XmlElement(name = "Age")
	private String player_Age;
	
	@XmlElement(name = "AgeDays")
	private String player_AgeDays;
	
	@XmlElement(name = "TSI")
	private String player_TSI;
	
	@XmlElement(name = "PlayerForm")
	private String player_Form;
	
	@XmlElement(name = "Experience")
	private String player_Experience;
	
	@XmlElement(name = "Loyalty")
	private String player_Loyalty;
	
	@XmlElement(name = "MotherClubBonus")
	private String player_MotherclubBonus;
	
	@XmlElement(name = "Leadership")
	private String player_Leadership;
	
	@XmlElement(name = "Salary")
	private String player_Salary;
	
	@XmlElement(name = "IsAbroad")
	private String player_IsAbroad;
	
	@XmlElement(name = "Agreeability")
	private String player_Agreeability;
	
	@XmlElement(name = "Agressiveness")
	private String player_Agressiveness;
	
	@XmlElement(name = "Honesty")
	private String player_Honesty;
	
	@XmlElement(name = "LeagueGoals")
	private String player_LeagueGoals;
	
	@XmlElement(name = "CupGoals")
	private String player_CupGoals;
	
	@XmlElement(name = "FriendliesGoals")
	private String player_FriendliesGoals;
	
	@XmlElement(name = "CareerGoals")
	private String player_CareerGoals;
	
	@XmlElement(name = "CareerHattricks")
	private String player_CareerHattricks;
	
	@XmlElement(name = "Speciality")
	private String player_Speciality;
	
	@XmlElement(name = "TransferListed")
	private String player_TransferListed;
	
	@XmlElement(name = "NationalTeamID")
	private String player_NationalTeamID;
	
	@XmlElement(name = "CountryID")
	private String player_CountryID;
	
	@XmlElement(name = "Caps")
	private String player_Caps;
	
	@XmlElement(name = "CapsU20")
	private String player_CapsU20;
	
	@XmlElement(name = "Cards")
	private String player_Cards;
	
	@XmlElement(name = "InjuryLevel")
	private String player_InjuryLevel;
	
	@XmlElement(name = "StaminaSkill")
	private String player_StaminaSkill;
	
	@XmlElement(name = "KeeperSkill")
	private String player_KeeperSkill;
	
	@XmlElement(name = "PlayMakerSkill")
	private String player_PlayMakerSkill;
	
	@XmlElement(name = "ScorerSkill")
	private String player_ScorerSkill;
	
	@XmlElement(name = "PassingSkill")
	private String player_PassingSkill;
	
	@XmlElement(name = "WingerSkill")
	private String player_WingerSkill;
	
	@XmlElement(name = "DefenderSkill")
	private String player_DefenderSkill;
	
	@XmlElement(name = "SetPiecesSkill")
	private String player_SetPiecesSkill;
	
	@XmlElement(name = "PlayerCategoryID")
	private String player_PlayerCategoryID;

	// // If you like the variable name, e.g. "name", you can easily change this
	// // name for your XML-Output:
	
	public String getPlayer_ID() {
		return player_ID;
	}
	
	public String getPlayer_FirstName() {
		return player_FirstName;
	}

	public String getPlayer_LastName() {
		return player_LastName;
	}

	public String getPlayer_NickName() {
		return player_NickName;
	}

	public String getPlayer_Age() {
		return player_Age;
	}

	public String getPlayer_AgeDays() {
		return player_AgeDays;
	}

	public String getPlayer_TSI() {
		return player_TSI;
	}

	public String getPlayer_Form() {
		return player_Form;
	}

	public String getPlayer_Experience() {
		return player_Experience;
	}

	public String getPlayer_Loyalty() {
		return player_Loyalty;
	}

	public String getPlayer_MotherclubBonus() {
		return player_MotherclubBonus;
	}

	public String getPlayer_Leadership() {
		return player_Leadership;
	}

	public String getPlayer_Salary() {
		return player_Salary;
	}

	public String getPlayer_IsAbroad() {
		return player_IsAbroad;
	}

	public String getPlayer_Agreeability() {
		return player_Agreeability;
	}

	public String getPlayer_Agressiveness() {
		return player_Agressiveness;
	}

	public String getPlayer_Honesty() {
		return player_Honesty;
	}

	public String getPlayer_LeagueGoals() {
		return player_LeagueGoals;
	}

	public String getPlayer_CupGoals() {
		return player_CupGoals;
	}

	public String getPlayer_FriendliesGoals() {
		return player_FriendliesGoals;
	}

	public String getPlayer_CareerGoals() {
		return player_CareerGoals;
	}

	public String getPlayer_CareerHattricks() {
		return player_CareerHattricks;
	}

	public String getPlayer_Speciality() {
		return player_Speciality;
	}

	public String getPlayer_TransferListed() {
		return player_TransferListed;
	}

	public String getPlayer_NationalTeamID() {
		return player_NationalTeamID;
	}

	public String getPlayer_CountryID() {
		return player_CountryID;
	}

	public String getPlayer_Caps() {
		return player_Caps;
	}

	public String getPlayer_CapsU20() {
		return player_CapsU20;
	}

	public String getPlayer_Cards() {
		return player_Cards;
	}

	public String getPlayer_InjuryLevel() {
		return player_InjuryLevel;
	}

	public String getPlayer_StaminaSkill() {
		return player_StaminaSkill;
	}

	public String getPlayer_KeeperSkill() {
		return player_KeeperSkill;
	}

	public String getPlayer_PlayMakerSkill() {
		return player_PlayMakerSkill;
	}

	public String getPlayer_ScorerSkill() {
		return player_ScorerSkill;
	}

	public String getPlayer_PassingSkill() {
		return player_PassingSkill;
	}

	public String getPlayer_WingerSkill() {
		return player_WingerSkill;
	}

	public String getPlayer_DefenderSkill() {
		return player_DefenderSkill;
	}

	public String getPlayer_SetPiecesSkill() {
		return player_SetPiecesSkill;
	}

	public String getPlayer_PlayerCategoryID() {
		return player_PlayerCategoryID;
	}
}
```

Klasse Test:


```
public class Test extends DefaultHandler {

public static void main(String[] args){
new Test();
}

	public Test() {
		getPlayers();
	}

	public void getPlayers() {
		try {
			JAXBContext context = JAXBContext.newInstance(All_Players.class,
					Player.class);

			Unmarshaller unmarschaller = context.createUnmarshaller();
			File file = new File("players_result.xml");
			
			// Deine Datei alternativ kannst du auch eine URL angeben, dann
			// musst du es nicht erst downloaden.
			All_Players all_players = (All_Players) unmarschaller
					.unmarshal(new InputStreamReader(new FileInputStream(file)));

			List<Player> players = all_players.getPlayers();

			for (int i = 0; i < players.size(); i++) {
				System.out.println(players.get(i).getPlayer_FirstName());
				System.out.println(players.get(i).getPlayer_LastName());
				System.out.println(players.get(i).getPlayer_TSI());
// und die ganzen weiteren Elemente die in der Player.Class drin sind
				System.out.println("=======================");
			}
		} catch (JAXBException e) {
			e.printStackTrace();
		} catch (Exception f) {
			f.printStackTrace();
		}
	}
}
```

Und nun noch das XML-File:
[XML]
<?xml version="1.0" encoding="utf-8"?>
<HattrickData>
  <FileName>players.xml</FileName>
  <Version>2.2</Version>
  <UserID>12314689</UserID>
  <FetchedDate>2012-03-11 22:16:23</FetchedDate>
  <UserIsSupporter>0</UserIsSupporter>
  <IsYouth>False</IsYouth>
  <ActionType>view</ActionType>
  <IsPlayingMatch>False</IsPlayingMatch>
  <Team>
    <TeamID>123456789</TeamID>
    <TeamName>TSV Hochhinaus</TeamName>
    <PlayerList>
      <Player>
        <PlayerID>266420488</PlayerID>
        <FirstName>Albertus</FirstName>
        <NickName></NickName>
        <LastName>Eijmael</LastName>
        <PlayerNumber>100</PlayerNumber>
        <Age>26</Age>
        <AgeDays>61</AgeDays>
        <TSI>30430</TSI>
        <PlayerForm>6</PlayerForm>
        <Statement></Statement>
        <Experience>5</Experience>
        <Loyalty>20</Loyalty>
        <MotherClubBonus>False</MotherClubBonus>
        <Leadership>6</Leadership>
        <Salary>118920</Salary>
        <IsAbroad>1</IsAbroad>
        <Agreeability>1</Agreeability>
        <Aggressiveness>4</Aggressiveness>
        <Honesty>2</Honesty>
        <LeagueGoals>1</LeagueGoals>
        <CupGoals>1</CupGoals>
        <FriendliesGoals>0</FriendliesGoals>
        <CareerGoals>18</CareerGoals>
        <CareerHattricks>0</CareerHattricks>
        <Specialty>0</Specialty>
        <TransferListed>0</TransferListed>
        <NationalTeamID>0</NationalTeamID>
        <CountryID>12</CountryID>
        <Caps>0</Caps>
        <CapsU20>0</CapsU20>
        <Cards>1</Cards>
        <InjuryLevel>-1</InjuryLevel>
        <StaminaSkill>7</StaminaSkill>
        <KeeperSkill>1</KeeperSkill>
        <PlaymakerSkill>6</PlaymakerSkill>
        <ScorerSkill>3</ScorerSkill>
        <PassingSkill>6</PassingSkill>
        <WingerSkill>5</WingerSkill>
        <DefenderSkill>13</DefenderSkill>
        <SetPiecesSkill>5</SetPiecesSkill>
        <PlayerCategoryId>0</PlayerCategoryId>
      </Player>
    </PlayerList>
  </Team>
</HattrickData>
[/XML]


Es wäre mir eine große Hilfe wenn sich jemand die Mühe machen könnte und die geposteten CodeTeile ausprobieren könnte.
Den Inhalt der XML-Datei einfach in eine Textdatei kopieren und als players_result.xml speichern.

Vielen dank.


----------



## XML_Problem (12. Mrz 2012)

Weiss denn niemand mehr Rat? Oder könnte das ausprobieren? 
Vielleicht seht ihr ja an dem obigen Codes von mir schon das Problem, aber ich versuche jetzt schon seit Tagen einfach dieses XML-Dokument auszulesen bzw. den Inhalt des XML-Elements "Player", um an die Daten eines jeden Spielers zu kommen...

Vielen Dank.


----------



## XML_Problem (12. Mrz 2012)

OK ich möchte diesen Post nutzen um das Problem ein wenig anschaulicher darzustellen.

Daher nochmal kurz meine Aktuelle Situation:
Das zugrunde liegende XML-Dokument sieht folgendermaßen aus. 
Es sollen *nur *die Daten die im Tag XML-Element <Player> stecken ausgelesen werden.
Ich verwende die XML-Annotation "@XmlElementWrapper(name = "PlayerList")" in der Klasse "PlayerList", befürchte aber, dass da das Problem liegt. Was ist denn mit dem XML-Element "Team"?
Muss ich da nicht auch irgendwie was angeben?

[XML]
<?xml version="1.0" encoding="utf-8"?>
<HattrickData>
  <FileName>players.xml</FileName>
  <Version>2.2</Version>
  <UserID>xxxxxx</UserID>
  <FetchedDate>2012-03-10 02:55:54</FetchedDate>
  <UserIsSupporter>0</UserIsSupporter>
  <IsYouth>False</IsYouth>
  <ActionType>view</ActionType>
  <IsPlayingMatch>False</IsPlayingMatch>
<Team>
    <TeamID>xxxx</TeamID>
    <TeamName>TSV Hochhinaus</TeamName>
    <PlayerList>
		<Player>
			<Vorname>Max</Vorname>
			<Nachname>Mustermann</Nachname>
			<Position>Mittelfeld</Position>
		</Player>
		<Player>
			<Vorname>Maxim</Vorname>
			<Nachname>Musterfrau</Nachname>
			<Position>Torwart</Position>
		</Player>
	</PlayerList>
</Team>
</HattrickData>
[/XML]

Hierzu erzeuge ich mir eine Klasse PlayerList, die sich eine Liste merkt um die Player aufzunehmen. Ich bitte hierbei auch um Überprüfung der XML-Annotationen, also ob ich da vielleicht was übersehen habe etc. .

```
@XmlRootElement(name = "HattrickData")
public class PlayerList {

	@XmlElementWrapper(name = "PlayerList")
	@XmlElement(name = "Player")
	private List<Player> spieler;

	public List<Player> getPlayer() {
		return spieler;
	}
}
```

Die Klasse Player:


```
@XmlType(name="Player")
public class Player {
 
    @XmlElement(name="Vorname")
    private String vorname;
    
    @XmlElement(name="Nachname")
    private String nachname;
    
    @XmlElement(name="Position")
    private String position;
    
    
    public String getNachname() {
        return nachname;
    }
    
    public String getPosition() {
        return position;
    }
    
    public String getVorname() {
        return vorname;
    }
}
```
Und meine Test-Hauptklasse:

```
public class Test {
 
    public static void main(String[] args) throws Exception {
        JAXBContext context = JAXBContext.newInstance(PlayerList.class, Player.class);
        
        Unmarshaller unmarschaller = context.createUnmarshaller();
        
        File file = new File("test.xml");
        PlayerList players = (PlayerList) unmarschaller
				.unmarshal(new InputStreamReader(new FileInputStream(file)));
        
        List<Player> spieler = players.getPlayer();
        
        for (int i = 0; i < spieler.size(); i++) {
			System.out.println(spieler.get(i).getVorname());
			System.out.println(spieler.get(i).getNachname());
			System.out.println(spieler.get(i).getPosition());
			System.out.println("=======================");
		}
    }
}
```


Kurze Anmerkung noch:
Der gepostete Code oben funktioniert übrigends NUR wenn ich das XML Dokument so abändere:

[XML]
<?xml version="1.0" encoding="utf-8"?>
<HattrickData>
  <FileName>players.xml</FileName>
  <Version>2.2</Version>
  <UserID>xxxxxx</UserID>
  <FetchedDate>2012-03-10 02:55:54</FetchedDate>
  <UserIsSupporter>0</UserIsSupporter>
  <IsYouth>False</IsYouth>
  <ActionType>view</ActionType>
  <IsPlayingMatch>False</IsPlayingMatch>
    <PlayerList>
		<Player>
			<Vorname>Max</Vorname>
			<Nachname>Mustermann</Nachname>
			<Position>Mittelfeld</Position>
		</Player>
		<Player>
			<Vorname>Maxim</Vorname>
			<Nachname>Musterfrau</Nachname>
			<Position>Torwart</Position>
		</Player>
	</PlayerList>
</HattrickData>
[/XML]

Wie ihr seht habe ich den TAG "Team" rausgelassen. Dann gehts. Sobald der Tag wieder drin ist gehts nicht.

Ist es möglich mehrere @XMLElementWrapper zu verwenden? Also mir würde etwas helfen wie z.B.:
@XmlElementWrapper(name = "Team", "PlayerList")

Ich will ja wirklich nicht nerven mit dem Thema, aber Lektüre und verschiedene Internetforen und Google konnten mir hierbei nicht helfen. Ihr seit meine letzte Hoffnung.

Danke.


----------



## Zertos (12. Mrz 2012)

Ich habe deinen Code nicht ausprobiert, aber ich würde mit dem eingebauten XMLParser arbeiten.
Hier mal mein Ansatz.
Die Player Klasse beinhaltet nur die für mich wichtigsten Variablen.
Mein Code basiert auf deiner XML Datei im Beitrag 9.

players_data.xml:
[XML]<?xml version="1.0" encoding="utf-8"?>
<HattrickData>
  <FileName>players.xml</FileName>
  <Version>2.2</Version>
  <UserID>12314689</UserID>
  <FetchedDate>2012-03-11 22:16:23</FetchedDate>
  <UserIsSupporter>0</UserIsSupporter>
  <IsYouth>False</IsYouth>
  <ActionType>view</ActionType>
  <IsPlayingMatch>False</IsPlayingMatch>
  <Team>
    <TeamID>123456789</TeamID>
    <TeamName>TSV Hochhinaus</TeamName>
    <PlayerList>
      <Player>
        <PlayerID>266420488</PlayerID>
        <FirstName>Albertus</FirstName>
        <NickName></NickName>
        <LastName>Eijmael</LastName>
        <PlayerNumber>100</PlayerNumber>
        <Age>26</Age>
        <AgeDays>61</AgeDays>
        <TSI>30430</TSI>
        <PlayerForm>6</PlayerForm>
        <Statement></Statement>
        <Experience>5</Experience>
        <Loyalty>20</Loyalty>
        <MotherClubBonus>False</MotherClubBonus>
        <Leadership>6</Leadership>
        <Salary>118920</Salary>
        <IsAbroad>1</IsAbroad>
        <Agreeability>1</Agreeability>
        <Aggressiveness>4</Aggressiveness>
        <Honesty>2</Honesty>
        <LeagueGoals>1</LeagueGoals>
        <CupGoals>1</CupGoals>
        <FriendliesGoals>0</FriendliesGoals>
        <CareerGoals>18</CareerGoals>
        <CareerHattricks>0</CareerHattricks>
        <Specialty>0</Specialty>
        <TransferListed>0</TransferListed>
        <NationalTeamID>0</NationalTeamID>
        <CountryID>12</CountryID>
        <Caps>0</Caps>
        <CapsU20>0</CapsU20>
        <Cards>1</Cards>
        <InjuryLevel>-1</InjuryLevel>
        <StaminaSkill>7</StaminaSkill>
        <KeeperSkill>1</KeeperSkill>
        <PlaymakerSkill>6</PlaymakerSkill>
        <ScorerSkill>3</ScorerSkill>
        <PassingSkill>6</PassingSkill>
        <WingerSkill>5</WingerSkill>
        <DefenderSkill>13</DefenderSkill>
        <SetPiecesSkill>5</SetPiecesSkill>
        <PlayerCategoryId>0</PlayerCategoryId>
      </Player>
	  <Player>
        <PlayerID>366420488</PlayerID>
        <FirstName>Hans</FirstName>
        <NickName></NickName>
        <LastName>Eijmael</LastName>
        <PlayerNumber>100</PlayerNumber>
        <Age>28</Age>
        <AgeDays>61</AgeDays>
        <TSI>30430</TSI>
        <PlayerForm>6</PlayerForm>
        <Statement></Statement>
        <Experience>5</Experience>
        <Loyalty>20</Loyalty>
        <MotherClubBonus>False</MotherClubBonus>
        <Leadership>6</Leadership>
        <Salary>118920</Salary>
        <IsAbroad>1</IsAbroad>
        <Agreeability>1</Agreeability>
        <Aggressiveness>4</Aggressiveness>
        <Honesty>2</Honesty>
        <LeagueGoals>1</LeagueGoals>
        <CupGoals>1</CupGoals>
        <FriendliesGoals>0</FriendliesGoals>
        <CareerGoals>18</CareerGoals>
        <CareerHattricks>0</CareerHattricks>
        <Specialty>0</Specialty>
        <TransferListed>0</TransferListed>
        <NationalTeamID>0</NationalTeamID>
        <CountryID>12</CountryID>
        <Caps>0</Caps>
        <CapsU20>0</CapsU20>
        <Cards>1</Cards>
        <InjuryLevel>-1</InjuryLevel>
        <StaminaSkill>7</StaminaSkill>
        <KeeperSkill>1</KeeperSkill>
        <PlaymakerSkill>6</PlaymakerSkill>
        <ScorerSkill>3</ScorerSkill>
        <PassingSkill>6</PassingSkill>
        <WingerSkill>5</WingerSkill>
        <DefenderSkill>13</DefenderSkill>
        <SetPiecesSkill>5</SetPiecesSkill>
        <PlayerCategoryId>0</PlayerCategoryId>
      </Player>
    </PlayerList>
  </Team>
  <Team>
    <TeamID>987654321</TeamID>
    <TeamName>ASV Tiefhinab</TeamName>
    <PlayerList>
      <Player>
        <PlayerID>166420488</PlayerID>
        <FirstName>Alexander</FirstName>
        <NickName></NickName>
        <LastName>Eijmael</LastName>
        <PlayerNumber>100</PlayerNumber>
        <Age>26</Age>
        <AgeDays>61</AgeDays>
        <TSI>30430</TSI>
        <PlayerForm>6</PlayerForm>
        <Statement></Statement>
        <Experience>5</Experience>
        <Loyalty>20</Loyalty>
        <MotherClubBonus>False</MotherClubBonus>
        <Leadership>6</Leadership>
        <Salary>118920</Salary>
        <IsAbroad>1</IsAbroad>
        <Agreeability>1</Agreeability>
        <Aggressiveness>4</Aggressiveness>
        <Honesty>2</Honesty>
        <LeagueGoals>1</LeagueGoals>
        <CupGoals>1</CupGoals>
        <FriendliesGoals>0</FriendliesGoals>
        <CareerGoals>18</CareerGoals>
        <CareerHattricks>0</CareerHattricks>
        <Specialty>0</Specialty>
        <TransferListed>0</TransferListed>
        <NationalTeamID>0</NationalTeamID>
        <CountryID>12</CountryID>
        <Caps>0</Caps>
        <CapsU20>0</CapsU20>
        <Cards>1</Cards>
        <InjuryLevel>-1</InjuryLevel>
        <StaminaSkill>7</StaminaSkill>
        <KeeperSkill>1</KeeperSkill>
        <PlaymakerSkill>6</PlaymakerSkill>
        <ScorerSkill>3</ScorerSkill>
        <PassingSkill>6</PassingSkill>
        <WingerSkill>5</WingerSkill>
        <DefenderSkill>13</DefenderSkill>
        <SetPiecesSkill>5</SetPiecesSkill>
        <PlayerCategoryId>0</PlayerCategoryId>
      </Player>
	  <Player>
        <PlayerID>466420488</PlayerID>
        <FirstName>Dieter</FirstName>
        <NickName></NickName>
        <LastName>Eijmael</LastName>
        <PlayerNumber>100</PlayerNumber>
        <Age>28</Age>
        <AgeDays>61</AgeDays>
        <TSI>30430</TSI>
        <PlayerForm>6</PlayerForm>
        <Statement></Statement>
        <Experience>5</Experience>
        <Loyalty>20</Loyalty>
        <MotherClubBonus>False</MotherClubBonus>
        <Leadership>6</Leadership>
        <Salary>118920</Salary>
        <IsAbroad>1</IsAbroad>
        <Agreeability>1</Agreeability>
        <Aggressiveness>4</Aggressiveness>
        <Honesty>2</Honesty>
        <LeagueGoals>1</LeagueGoals>
        <CupGoals>1</CupGoals>
        <FriendliesGoals>0</FriendliesGoals>
        <CareerGoals>18</CareerGoals>
        <CareerHattricks>0</CareerHattricks>
        <Specialty>0</Specialty>
        <TransferListed>0</TransferListed>
        <NationalTeamID>0</NationalTeamID>
        <CountryID>12</CountryID>
        <Caps>0</Caps>
        <CapsU20>0</CapsU20>
        <Cards>1</Cards>
        <InjuryLevel>-1</InjuryLevel>
        <StaminaSkill>7</StaminaSkill>
        <KeeperSkill>1</KeeperSkill>
        <PlaymakerSkill>6</PlaymakerSkill>
        <ScorerSkill>3</ScorerSkill>
        <PassingSkill>6</PassingSkill>
        <WingerSkill>5</WingerSkill>
        <DefenderSkill>13</DefenderSkill>
        <SetPiecesSkill>5</SetPiecesSkill>
        <PlayerCategoryId>0</PlayerCategoryId>
      </Player>
    </PlayerList>
  </Team>
</HattrickData>[/XML]

Ausgabe ist folgende:


> Team ID: 123456789
> Team Name: TSV Hochhinaus
> Player ID: 266420488
> Player Name: Albertus Eijmael
> ...



TeamParser.java:

```
package xml;

import java.io.IOException;
import java.util.ArrayList;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class TeamParser
{
	private Document doc;
	private ArrayList<Team> teamList;
	
	public static void main(String[] args) 
	{
		try
		{
			TeamParser parser = new TeamParser("player_data.xml");
			parser.parseFile();
			parser.printTeams();
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}
	
	public TeamParser(String file) throws ParserConfigurationException, SAXException, IOException
	{
		teamList = new ArrayList<Team>();
		
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		dbf.setValidating(true);
		dbf.setIgnoringComments(true);
		dbf.setIgnoringElementContentWhitespace(true);
		dbf.setExpandEntityReferences(true);
		DocumentBuilder db = dbf.newDocumentBuilder();
		db.setErrorHandler(new DefaultHandler());
		doc = db.parse(file);
	}
	
	public void parseFile()
	{
		NodeList teams = doc.getElementsByTagName("Team");	// Liste mit den <Team> Knoten
		String teamName, firstName, lastName;
		int teamID, playerID, playerNumber, age;
		
		for (int i = 0; i < teams.getLength(); i++)
		{
			Element team = (Element) teams.item(i);		// Knoten/Element <Team>
			
			teamID = Integer.parseInt(team.getElementsByTagName("TeamID").item(0).getTextContent());
			teamName = team.getElementsByTagName("TeamName").item(0).getTextContent();	
			teamList.add(new Team(teamID, teamName));		
			
			NodeList playerList = team.getElementsByTagName("Player");
			
			for (int j = 0; j < playerList.getLength(); j++)
			{
				Element player = (Element) playerList.item(j);
				
				playerID = Integer.parseInt(player.getElementsByTagName("PlayerID").item(0).getTextContent());
				firstName = player.getElementsByTagName("FirstName").item(0).getTextContent();
				lastName = player.getElementsByTagName("LastName").item(0).getTextContent();
				playerNumber = Integer.parseInt(player.getElementsByTagName("PlayerNumber").item(0).getTextContent());
				age = Integer.parseInt(player.getElementsByTagName("Age").item(0).getTextContent());				
				teamList.get(i).addPlayer(new Player(playerID, firstName, lastName, playerNumber, age));
			}
		}
	}
	
	public void printTeams()
	{
		for (int i = 0; i < teamList.size(); i++)
		{
			Team team = teamList.get(i);
			System.out.println("Team ID: " + teamList.get(i).getID() + "\nTeam Name: " + teamList.get(i).getName());
			for (int j = 0; j < teamList.get(i).getPlayerCount(); j++)
			{
				Player player = team.getPlayer(j);
				System.out.println("Player ID: " + player.getID() + "\nPlayer Name: " + player.getFirstName() + " " + player.getLastName() 
						+ "\nPlayer Number: " + player.getNumber() + "\nPlayer Age: " + player.getAge());
			}
			System.out.println("-----------------------------------");
		}
	}
}
```

Player.java:

```
package xml;

public class Player
{
	private int id;
	private String firstName;
	private String nickName;
	private String lastName;
	private int number;
	private int age;
	private int ageDays;
	private int tsi;
	
	public Player(int id, String firstName, String lastName, int number, int age)
	{
		this.id = id;
		this.firstName = firstName;
		this.lastName = lastName;
		this.number = number;
		this.age = age;
	}
	
	public Player(int id, String firstName, String lastName, int number, int age, int ageDays, int tsi)
	{
		this(id, firstName, lastName, number, age);
		this.ageDays = ageDays;
		this.tsi = tsi;
	}
	
	public int getID()
	{
		return id;
	}
	
	public String getFirstName()
	{
		return firstName;
	}
	
	public String getNickName()
	{
		return nickName;
	}
	
	public String getLastName()
	{
		return lastName;
	}
	
	public int getNumber()
	{
		return number;
	}
	
	public int getAge()
	{
		return age;
	}
	
	public int getAgeDays()
	{
		return ageDays;
	}
	
	public int getTSI()
	{
		return tsi;
	}
}
```

Team.java:

```
package xml;

import java.util.ArrayList;

public class Team
{
	private int id;
	private String name;
	private ArrayList<Player> playerList;
	
	public Team(int id, String name)
	{
		playerList = new ArrayList<Player>();
		this.id = id;
		this.name = name;
	}
	
	public void addPlayer(Player player)
	{
		playerList.add(player);
	}
	
	public Player getPlayer(int index)
	{
		return playerList.get(index);
	}
	
	public int getPlayerCount()
	{
		return playerList.size();
	}
	
	public int getID()
	{
		return id;
	}
	
	public String getName()
	{
		return name;
	}
}
```

Gibt bestimmt Optimierungsmöglichkeiten und ich freue mich über jeden Vorschlag


----------



## BOBOHelp (12. Mrz 2012)

hallo,

ich habe schon ein mal dir alles gepostet. aber nein "man kann es kürzer machen"!. hier erneut alle klassen. dazu brauchst du nur "unmarshall" an HattrickData machen und hast alle daten drin, die kannst du beliebig auslesen:

```
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "TeamType", propOrder = {
    "teamID",
    "teamName",
    "playerList"
})
public class TeamType {

    @XmlElement(name = "TeamID", required = true)
    protected String teamID;
    @XmlElement(name = "TeamName", required = true)
    protected String teamName;
    @XmlElement(name = "PlayerList", required = true)
    protected PlayerListType playerList;

    public String getTeamID() {
        return teamID;
    }

    public void setTeamID(String value) {
        this.teamID = value;
    }

    public String getTeamName() {
        return teamName;
    }

    public void setTeamName(String value) {
        this.teamName = value;
    }

    public PlayerListType getPlayerList() {
        return playerList;
    }

    public void setPlayerList(PlayerListType value) {
        this.playerList = value;
    }

}
```


```
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;


@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "PlayerType", propOrder = {
    "vorname",
    "nachname",
    "position"
})
public class PlayerType {

    @XmlElement(name = "Vorname", required = true)
    protected String vorname;
    @XmlElement(name = "Nachname", required = true)
    protected String nachname;
    @XmlElement(name = "Position", required = true)
    protected String position;


    public String getVorname() {
        return vorname;
    }

    public void setVorname(String value) {
        this.vorname = value;
    }

    public String getNachname() {
        return nachname;
    }

    public void setNachname(String value) {
        this.nachname = value;
    }

    public String getPosition() {
        return position;
    }

    public void setPosition(String value) {
        this.position = value;
    }

}
[code=Java]
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;



@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "PlayerListType", propOrder = {
    "player"
})
public class PlayerListType {

    @XmlElement(name = "Player")
    protected List<PlayerType> player;

    public List<PlayerType> getPlayer() {
        if (player == null) {
            player = new ArrayList<PlayerType>();
        }
        return this.player;
    }

}
```


```
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "HattrickDataType", propOrder = {
    "fileName",
    "version",
    "userID",
    "fetchedDate",
    "userIsSupporter",
    "isYouth",
    "actionType",
    "isPlayingMatch",
    "team"
})
public class HattrickDataType {

    @XmlElement(name = "FileName", required = true)
    protected String fileName;
    @XmlElement(name = "Version", required = true)
    protected String version;
    @XmlElement(name = "UserID", required = true)
    protected String userID;
    @XmlElement(name = "FetchedDate", required = true)
    protected String fetchedDate;
    @XmlElement(name = "UserIsSupporter", required = true)
    protected String userIsSupporter;
    @XmlElement(name = "IsYouth", required = true)
    protected String isYouth;
    @XmlElement(name = "ActionType", required = true)
    protected String actionType;
    @XmlElement(name = "IsPlayingMatch", required = true)
    protected String isPlayingMatch;
    @XmlElement(name = "Team", required = true)
    protected TeamType team;

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String value) {
        this.fileName = value;
    }

    public String getVersion() {
        return version;
    }

    public void setVersion(String value) {
        this.version = value;
    }

    public String getUserID() {
        return userID;
    }

    public void setUserID(String value) {
        this.userID = value;
    }

    public String getFetchedDate() {
        return fetchedDate;
    }

    public void setFetchedDate(String value) {
        this.fetchedDate = value;
    }

    public String getUserIsSupporter() {
        return userIsSupporter;
    }

    public void setUserIsSupporter(String value) {
        this.userIsSupporter = value;
    }

    public String getIsYouth() {
        return isYouth;
    }

    public void setIsYouth(String value) {
        this.isYouth = value;
    }

    public String getActionType() {
        return actionType;
    }

    public void setActionType(String value) {
        this.actionType = value;
    }

    public String getIsPlayingMatch() {
        return isPlayingMatch;
    }

    public void setIsPlayingMatch(String value) {
        this.isPlayingMatch = value;
    }

    public TeamType getTeam() {
        return team;
    }

    public void setTeam(TeamType value) {
        this.team = value;
    }

}
```


----------



## ...ButAlive (13. Mrz 2012)

Der ganze Overhead den XJC dabei erzeugt ist bei deinem Problem irrelevant. 

Wenn ich dich richtig verstanden habe, speicherst du die Daten die du bekommst per Hand selbst ab. Deine Plattform ist Windows. Wenn du beim FileReader/Writer nichts weiter angibtst ist das Encoding das Default-Encoding der Plattform, in deinem Fall ISO-8859-1, also das von Windows. Der Server schickt jetzt aber UTF-8. Diese UTF-8-Daten ließt und speicherst du als ISO-8859-1 und versuchst sie wieder als ISO-8859-1 zu lesen. 

Entweder du bleibst die ganze Zeit bei UTF-8, sprich du gibst es immer mit wenn du irgendwie die Daten ließt und schreibst, oder du ließt die Daten wenn sie von der URL kommen als UTF-8 und speicherst sie als ISO-8859-1.

Das was in der XML-Datei steht ist in deinem Fall irrelevant.


----------



## XML_Problem (13. Mrz 2012)

@ ...ButAlive

Also:
Um an die Daten zu kommen nutze ich eine JAVA oAuth-API namens Scribe.
Diese API liefert mir die nötigen Klassen um auf der Website Hattrick.org XML-Daten abzurufen. 
Diese API selbst liefert mir einen String der im UTF-8 Standard gespeichert wird.
Ich selbst erzeuge mit 

```
.
.
.
xmlFile = new File("XML/players_result.xml");
			BufferedWriter out = new BufferedWriter(new OutputStreamWriter(
					new FileOutputStream(xmlFile)));

			out.write(response_Players.getBody()); // getBody() liefert den langen String des XML Dokumentes im UTF-8 Standard
			out.close();
.
.
.
```

Dieses XML File soll im Anschluss nur ausgelesen werden um, wie hier bereits mehrfach aufgezeigt, die Spieler einer Fussballmannschaft in Objekten zu speichern. Diese Objekte sollen im Weiteren verwendet werden um damit eine JTable oder was auch immer zu füllen und die Daten in schöner lesbarer Form für einen Benutzer auf einer GUI zur Verfügung zu stellen.

Ich konnte mit deiner Lösung oben leider kein positives Ergebnis erzielen. Auch als du sagtest:


> Das was BoBoHelp gepostet hat kommt raus, wenn man sich das aus einem XSD/DDT generieren lässt. Das geht natürlich auch. Es geht aber auch kürzer:
> 
> .
> .
> ...



Das funktioniert nur mit einer XML Datei dieser Form:
[XML]
<?xml version="1.0" encoding="utf-8"?>
<HattrickData>
  <FileName>players.xml</FileName>
  <Version>2.2</Version>
  <UserID>xxxxxxx</UserID>
  <FetchedDate>2012-03-10 02:55:54</FetchedDate>
  <UserIsSupporter>0</UserIsSupporter>
  <IsYouth>False</IsYouth>
  <ActionType>view</ActionType>
  <IsPlayingMatch>False</IsPlayingMatch>
<Team>
<Player>
<Vorname>Max</Vorname>
<Nachname>Mustermann</Nachname>
<Position>Mittelfeld</Position>
</Player>
</Team>
</HattrickData>
[/XML]

Aber es funktioniert NICHT mit der folgenden XML-Form. Hier ist es wichtig, dass es geht, da ich NUR in der Form die XML Dateien erhalte, wenn ich sie downloade.
[XML]
<?xml version="1.0" encoding="utf-8"?>
<HattrickData>
  <FileName>players.xml</FileName>
  <Version>2.2</Version>
  <UserID>12314689</UserID>
  <FetchedDate>2012-03-11 22:16:23</FetchedDate>
  <UserIsSupporter>0</UserIsSupporter>
  <IsYouth>False</IsYouth>
  <ActionType>view</ActionType>
  <IsPlayingMatch>False</IsPlayingMatch>
  <Team>
    <TeamID>123456789</TeamID>
    <TeamName>TSV Hochhinaus</TeamName>
    <PlayerList>
      <Player>
        <PlayerID>266420488</PlayerID>
        <FirstName>Albertus</FirstName>
        <NickName></NickName>
        <LastName>Eijmael</LastName>
        <PlayerNumber>100</PlayerNumber>
        <Age>26</Age>
        <AgeDays>61</AgeDays>
        <TSI>30430</TSI>
        <PlayerForm>6</PlayerForm>
        <Statement></Statement>
        <Experience>5</Experience>
        <Loyalty>20</Loyalty>
        <MotherClubBonus>False</MotherClubBonus>
        <Leadership>6</Leadership>
        <Salary>118920</Salary>
        <IsAbroad>1</IsAbroad>
        <Agreeability>1</Agreeability>
        <Aggressiveness>4</Aggressiveness>
        <Honesty>2</Honesty>
        <LeagueGoals>1</LeagueGoals>
        <CupGoals>1</CupGoals>
        <FriendliesGoals>0</FriendliesGoals>
        <CareerGoals>18</CareerGoals>
        <CareerHattricks>0</CareerHattricks>
        <Specialty>0</Specialty>
        <TransferListed>0</TransferListed>
        <NationalTeamID>0</NationalTeamID>
        <CountryID>12</CountryID>
        <Caps>0</Caps>
        <CapsU20>0</CapsU20>
        <Cards>1</Cards>
        <InjuryLevel>-1</InjuryLevel>
        <StaminaSkill>7</StaminaSkill>
        <KeeperSkill>1</KeeperSkill>
        <PlaymakerSkill>6</PlaymakerSkill>
        <ScorerSkill>3</ScorerSkill>
        <PassingSkill>6</PassingSkill>
        <WingerSkill>5</WingerSkill>
        <DefenderSkill>13</DefenderSkill>
        <SetPiecesSkill>5</SetPiecesSkill>
        <PlayerCategoryId>0</PlayerCategoryId>
      </Player>
</PlayerList>
</Team>
</HattrickData>
[/XML]


@BoBoHelp

Ich danke für deine Hilfe. Ich habe es nun nachgebaut und die Implementierung funktioniert auch sehr gut.

Dennoch wäre es interessant zu wissen, ob eine funktionierende Lösung wie ...ButAlive es gepostet hat auch möglich ist. Also auch hier wäre ich dankbar, wenn man eine Lösung hierfür erhalten könnte.


XML in Verbindung mit Java ist eine echt neue Sache mit vielen Stolpersteinen für mich. Daher wäre ich dankbar wenn ihr mir vielleicht ein wenig Lektüre, Onlinematerial usw. nennen könntet die ich zum Lernen verwenden kann. Ich muss da mal einiges aufarbeiten. Das habe ich deutlich gemerkt.


----------



## Zertos (13. Mrz 2012)

Hab da mal eine Frage zu dem Code.
Warum sind die ganzen Variablen protected? Muss das so sein, damit JAXB funktioniert?

Mein Ansatz über den DOMParser ist wohl nicht empfehlenswert?


----------

