Objekt erzeugen aus einem XML Datei

X

XML_Problem

Gast
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
Java:
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
 
B

...ButAlive

Gast
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
Java:
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
Java:
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:

Java:
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
 
X

XML_Problem

Gast
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
 
B

BoBoHelp

Gast
Hallo,
hier ein Vorschlag:

EINE JAVA-CLASS: HattrickDataType.java

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

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


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:

Java:
@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.
 
B

...ButAlive

Gast
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:

Java:
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
Code:
@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
Code:
@XMLElement
entsprechend annotieren.

Die Klasse Spieler bleibt wie gehabt.
 
X

XML_Problem

Gast
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,
Java:
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:

Java:
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)

Code:
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.:
Java:
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?
 
X

XML_Problem

Gast
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.
 
X

XML_Problem

Gast
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:
Java:
@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:
Java:
@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:

Java:
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.
 
X

XML_Problem

Gast
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.
 
X

XML_Problem

Gast
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. .
Java:
@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:

Java:
@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:
Java:
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

Mitglied
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
Player Number: 100
Player Age: 26
Player ID: 366420488
Player Name: Hans Eijmael
Player Number: 100
Player Age: 28
-----------------------------------
Team ID: 987654321
Team Name: ASV Tiefhinab
Player ID: 166420488
Player Name: Alexander Eijmael
Player Number: 100
Player Age: 26
Player ID: 466420488
Player Name: Dieter Eijmael
Player Number: 100
Player Age: 28
-----------------------------------

TeamParser.java:
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:
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:
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 :)
 
Zuletzt bearbeitet:
B

BOBOHelp

Gast
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:
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 = "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;
    }

}

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 = "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;
    }

}

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",
    "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;
    }

}
 
B

...ButAlive

Gast
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.
 
X

XML_Problem

Gast
@ ...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
Java:
.
.
.
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:

.
.
.

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.

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

Mitglied
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?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Say abstract class und Objekt erzeugen - Dringend Hilfe Java Basics - Anfänger-Themen 10
W Mehrfach das gleiche Attribut für ein Objekt erzeugen (mit verschiedenen Werten) Java Basics - Anfänger-Themen 2
E Objekt durch Benutzer über Konsole erzeugen - Java Java Basics - Anfänger-Themen 3
I Object-Oriented Programming, Objekt erzeugen Java Basics - Anfänger-Themen 1
P Objekt aus String-Array erzeugen Java Basics - Anfänger-Themen 104
G Objekt der selben Klasse wie selbst mit Aufrufen des Konstruktors erzeugen Java Basics - Anfänger-Themen 14
B OOP Objekt in IF erzeugen - funktioniert nicht so richtig Java Basics - Anfänger-Themen 11
P Objekt mit =new in Methode erzeugen Java Basics - Anfänger-Themen 4
N Objekt in Methode einer anderen Klasse erzeugen Java Basics - Anfänger-Themen 9
D Objekt per If erzeugen. Java Basics - Anfänger-Themen 11
J Objekt mit Methodendruchlauf erzeugen Java Basics - Anfänger-Themen 1
P Vererbung Neues Objekt aus Vorlage erzeugen Java Basics - Anfänger-Themen 1
P Kapselung Variable innerhalb einer inneren Klasse ansprechen ohne ein Objekt erzeugen zu müssen? Java Basics - Anfänger-Themen 6
M Neues Objekt erzeugen mit Klassennamen oder ohne Java Basics - Anfänger-Themen 5
B Warum ein Objekt mit zweimal new erzeugen? Java Basics - Anfänger-Themen 14
J Methode ausgeben(Objekt erzeugen) Java Basics - Anfänger-Themen 13
S Objekt in Objekt erzeugen Java Basics - Anfänger-Themen 2
L Objekt erzeugen mit eigenem typ Java Basics - Anfänger-Themen 5
M Verständnisfrage: Objekt erzeugen u. zuweisen Java Basics - Anfänger-Themen 16
M Kann kein Objekt (AudioFile in diesem Beispiel) für ein leeren String erzeugen Java Basics - Anfänger-Themen 3
S Objekt mehrfach erzeugen Java Basics - Anfänger-Themen 3
P Kann ich ein Objekt vom Typ Interface erzeugen? Java Basics - Anfänger-Themen 4
R String einlesen, Textdatei danach durchsuchen und aus Zeile Objekt erzeugen Java Basics - Anfänger-Themen 5
S objekt erzeugen Java Basics - Anfänger-Themen 6
C Objekt von Klasse im gleichen Paket erzeugen Java Basics - Anfänger-Themen 8
K Objekt erzeugen. Java Basics - Anfänger-Themen 1
B neues Objekt erzeugen Java Basics - Anfänger-Themen 7
G objekt der selben klasse erzeugen Java Basics - Anfänger-Themen 4
F Objekt aus anderem Objekt erzeugen Java Basics - Anfänger-Themen 6
G Date Objekt für aktuelles Datum erzeugen Java Basics - Anfänger-Themen 9
B Array mehrmals als Objekt erzeugen Java Basics - Anfänger-Themen 17
T Möchte ein neues Objekt erzeugen mit Wert von anderem Objekt Java Basics - Anfänger-Themen 9
B Aus gegebenem String Objekt erzeugen Java Basics - Anfänger-Themen 5
S Problem neues Objekt erzeugen Java Basics - Anfänger-Themen 4
N Class-Objekt aus File-Objekt erzeugen? Java Basics - Anfänger-Themen 14
pro_progger Image-Objekt erzeugen ? Java Basics - Anfänger-Themen 7
J Objekt aus anderer Klasse und Package erzeugen Java Basics - Anfänger-Themen 11
R leeres Feld im GridLayout (dummy Objekt erzeugen?) Java Basics - Anfänger-Themen 2
M Ausgabe einer ArrayList ensteht nur als Hashcode, nicht als Objekt Java Basics - Anfänger-Themen 16
Rxiiz Objekt aus ComboBox entfernen Java Basics - Anfänger-Themen 4
I JSON in Objekt umwandeln Java Basics - Anfänger-Themen 3
P Objekt einer Methode eines anderen Objektes übergeben Java Basics - Anfänger-Themen 5
I Klassen von einem package laden, Statisches Feld auslesen und Objekt erstellen Java Basics - Anfänger-Themen 8
B Objekt aus generalisierter Liste entfernen Java Basics - Anfänger-Themen 11
Soranix Erste Schritte Struktur als Anfänger // Von einer Klasse auf ein Objekt einer anderen Klasse zugreifen. Java Basics - Anfänger-Themen 6
Say Objekt Java Basics - Anfänger-Themen 4
T Wie kann man es machen das ein Objekt nicht übermalt wird Java Basics - Anfänger-Themen 2
D OOP Array einem Objekt zuweisen Java Basics - Anfänger-Themen 2
I Entity Objekt nicht gefunden -> Webhook empfangen in der gleichen Methode (Transaktion) Java Basics - Anfänger-Themen 37
K warum kann ich das Objekt nicht erstellen ? Java Basics - Anfänger-Themen 2
K wie kann ich alle Attribute von dem Objekt(pagode) ausgeben lassen ? Java Basics - Anfänger-Themen 3
H Ein übergegebenes Objekt auf null setzen Java Basics - Anfänger-Themen 9
M BlueJ Objekt in Objektliste Java Basics - Anfänger-Themen 2
B Objekt in Klassendiagramm an fremdes Objekt weiterreichen? Java Basics - Anfänger-Themen 6
Fodoboo131 RegEx- Umwandlung von String in ausführbares Objekt/ Befehl Java Basics - Anfänger-Themen 9
frager2345 Aufgabe Hash Objekt Elemente ausgeben Java Basics - Anfänger-Themen 2
amelie123456 Objekt Farbe Quellcode Java Basics - Anfänger-Themen 4
M Objekt in einem Objekt speichern Java Basics - Anfänger-Themen 9
U Warum kann ich, auf private Variablen zugreifen, wenn ich ein Objekt in der Klasse, die private Variablen hat erstelle und dort drauf zugreifen will? Java Basics - Anfänger-Themen 7
missy72 Klassen Objekt Array NullPointerException Java Basics - Anfänger-Themen 3
J Hinzufügen eines Objektes in ein Objekt-Array Java Basics - Anfänger-Themen 62
O Warum bekommen wir nicht die Referenz vom zurückgegebenen Objekt? Java Basics - Anfänger-Themen 4
K Ein Objekt Auto kennt den Inhalt seines links und rechtsstehenden Autos, wie soll man das ermöglichen Java Basics - Anfänger-Themen 2
W Unterschiede bei Zugriff auf Objekt und Klassenvariablen über einen Getter? Java Basics - Anfänger-Themen 2
melaniemueller Fernseher als Objekt Java Basics - Anfänger-Themen 9
B Datentyp für Einzelnes Objekt oder Liste Java Basics - Anfänger-Themen 9
Nina Pohl Ein Vorgang bezog sich auf ein Objekt, das kein Socket ist Java Basics - Anfänger-Themen 6
B Objekt kopieren und sämtliche Referenzen von diesem Objekt? Java Basics - Anfänger-Themen 3
S JavaFX - Objekt an neue Stage übergeben Java Basics - Anfänger-Themen 12
T Verständnisfrage Objekt Getter Setter Java Basics - Anfänger-Themen 102
P Objekt in mehreren Methoden verwenden. Java Basics - Anfänger-Themen 3
S Aufzurufendes Objekt Java Basics - Anfänger-Themen 3
CptK Überprüfen ob übergebenes Objekt zu Generics passt Java Basics - Anfänger-Themen 2
C Konstruktor ab serialisiertem Objekt Java Basics - Anfänger-Themen 4
Kalibru Problem bei Ausgabe von Objekt Java Basics - Anfänger-Themen 1
P Wie rufe ich Methoden mit einer Referenz auf eine Klasse||Objekt auf Java Basics - Anfänger-Themen 4
J Input/Output Konstruktor ergänzen, der zur Datei mit einem Objekt passt Java Basics - Anfänger-Themen 0
P Ein Objekt nach einem String durchsuchen? Java Basics - Anfänger-Themen 7
S Objekt aus Arraylist in andere Arraylist kopieren? Java Basics - Anfänger-Themen 2
J Objekt-Array dynamischer Länge aus Benutzereingaben erstellen Java Basics - Anfänger-Themen 6
C Arrays - deklarieren, initialisieren? Ist das ein Objekt? Java Basics - Anfänger-Themen 3
B Interface List - Objekt übergeben? Einzelnes Objekt geht, aber Liste nicht? Java Basics - Anfänger-Themen 4
B Objekt von EJB in Controller (CDI) - Klasse füllen? Java Basics - Anfänger-Themen 3
L Zufälliges Objekt aus der ArraylList ohne java.util.Random Java Basics - Anfänger-Themen 56
N LocalTime einem Objekt zuweisen Java Basics - Anfänger-Themen 2
N Länge eines Arrays in einem Objekt testen Java Basics - Anfänger-Themen 51
M Wie kann ich ein Objekt erstellen, wenn sich der Klassenname in einer Variablen befindet? Java Basics - Anfänger-Themen 10
R Zugriff auf den Index eines Arrays, welches ein Objekt ist. Java Basics - Anfänger-Themen 4
tom.j85 Doppelte Foreach Schleife: Am Ende wird immer das Gleiche Objekt eingefügt Java Basics - Anfänger-Themen 4
J RSA Verschlüsselung Testen / byte[] in Objekt umwandeln Java Basics - Anfänger-Themen 1
M ArrayList - Objekt kopieren und ändern Java Basics - Anfänger-Themen 11
L Objekt an Methode übergeben Java Basics - Anfänger-Themen 4
S Spiel-Programmieren. Wenn ein Objekt den anderen berührt. Java Basics - Anfänger-Themen 6
J Y-Koordinate von GUI-Objekt bestimmen Java Basics - Anfänger-Themen 2
M Auf erstelltes Objekt einer anderen Klasse zugreifen. Java Basics - Anfänger-Themen 5
H Referenz Objekt aufrufen Java Basics - Anfänger-Themen 12
M Objekt mit eindeutiger ID löschen, das nächste Objekt hat dann diese ID Java Basics - Anfänger-Themen 5
N Mit Objekt der Superklasse auf Methode der Subklasse zugreifen Java Basics - Anfänger-Themen 6
J Objekt bei Auswahl in jList ändern Java Basics - Anfänger-Themen 6
Kirby.exe Generische Objekt Instanz erstellen Java Basics - Anfänger-Themen 14

Ähnliche Java Themen

Neue Themen


Oben