# XML auf Java Klassen Mappen



## sparefroh (11. Jan 2014)

Hey liebe Community,


leider benötige ich wieder einmal eure Hilfe.

Derzeit stehe ich vor dem Problem, dass ich eine XML Datei auslesen muss damit ich diese dann auf meine Java Klassen Mappen kann.

Habe auch schon gegooglt, aber leider weiß ich immer noch nicht was die beste Lösung bzw. eine gute Lösung für mein Problem ist.

Ich hoffe Ihr könnt mir weiterhelfen.

Konkret handelt es sich um diese XML Datei:

[XML]
<?xml version="1.0" encoding="UTF-8"?> 
<!-- XML Struktur/Example -->
<JavaFXApplication>
	<GlobalSettings>
		<!-- hier kommt die DB Connection oder in weiterer Folge der File Pfad rein. -->
		<ConnectionString>jdbcracle:thindelphi.htl-leonding.ac.at:1521:delphidb [hd090006 on HD090006]</ConnectionString>
	</GlobalSettings>

	<Pages>
		<Page>
			<Name>Page1</Name>
			<!-- Textgröße für die Überschrift -->
			<TextSize>15</TextSize>

			<Button>
				<Name>Button1</Name>
				<LinkedPage>Page2</LinkedPage>
				<!-- hier kommt der Spaltenname oder statischer Wert?" -->
				<Parameter>ID</Parameter>
			</Button>

			<Table>
				<!-- hier kann die Textgröße für die Table definiert werden -->
				<TextSize>15</TextSize>
				<!-- hier kommt die SQL Query rein -->
				<Statement>select * from emp where id = ?</Statement>
				<!-- Spalten die nicht angezeigt werden sollen (z.b id) -->
				<NonDisplay>ID</NonDisplay>
				<NonDisplay>NAME</NonDisplay>
				<!-- für gewisse Spalten kann eine bevorzugte Breite ergänzt werden -->
				<PreferedDimension>
					<!-- welche Spalte soll eine best. Größe haben -->
					<ColumnName>STRASSE</ColumnName>
					<MinWidth>10</MinWidth>
					<MaxWidth>15</MaxWidth>
				</PreferedDimension>
			</Table>
		</Page>
		<Page>
			<Name>Page2</Name>
			<!-- Textgröße für die Überschrift -->
			<TextSize>15</TextSize>
			<Button>
				<Name>Button1</Name>
				<LinkedPage>Page1</LinkedPage>
				<!-- hier kommt der Spaltenname oder statischer Wert?" -->
				<!-- <Parameter ID /> -->
			</Button>

			<TextField>
				<!-- Größe des Textes -->
				<TextSize>15</TextSize>
				<!-- Ausrichtung des Textes -->
				<Orientation>Center</Orientation>
				<!-- Der Text der später angezeigt wird -->
				<Text>
					Das ist der Text der später angezeigt wird.
					Eventuell sollten Tags für Farben oder ähnliches ergänzt werden.
				</Text>
			</TextField>
		</Page>
	</Pages>
</JavaFXApplication>
[/XML]

Daraus möchte ich dann diese Klasse erstellen:


```
public class FxPage {
    private String pageName;
    
    private List<ButtonInformation> buttonInformation = new LinkedList();
    private Boolean isTable;
    private String tableOrTextfieldName;
    private int textSize;
    private String textOrientation;
    private List<String> nonDisplayColumn = new LinkedList();
    
    private List<PreferedDimension> preferedTableDimension = new LinkedList();
    private String statement;
}
```

Hier die weiteren Klassen die verwendet werden:


```
public class ButtonInformation {
    private String buttonName;
    private String linkedPage;
    private String parameter;
}

public class PreferedDimension {
    private double minWidth;
    private double maxWidth;
}
```


Ich hoffe Ihr könnt mir helfen, auch wenn es sich hier wahrscheinlich um ein eher triviales Problem handeln wird.

Liebe Grüße

Johannes


----------



## turtle (12. Jan 2014)

Ich glaube du kannst aus der Fülle der XML-Frameworks dich aus zwei verschiedenen Ansätzen wählen.

Erstens könntest du *JAXB *nehmen. Hierzu müsstest du eine Java-Datei erstellen und diese mit Annotations füllen, die beim Marshalling, also dem Erstellen einer XML-Datei aus den Java-Dateien, bzw. Unmarhaling, also dem Erstellen von Java-Objekten aus XML-Datei helfen. Ich vermute da wirst du bei der angegebenen XML-Datei Änderungen an den Java-Klassen machen müssen.

Die zweite Möglichekeit wäre das Parsen der XML-Datei mit *XPATH*. Hier kannst du gezielt angegeben aus welcher XML-Struktur welche Informationen in Java übernommen werden sollen.


----------



## sparefroh (12. Jan 2014)

Vielen Dank für die super Antwort!!


Noch eine kurze Frage, wie müsste ich denn die Klassen verändern?

Bzw. was würdest du für einen Ansatz nehmen?

Lg

Johannes


----------



## turtle (12. Jan 2014)

Ich würde in Java quasi die XML-Struktur mit Klassen nachbauen und jede Klasse geeignet annotieren.

Also beispielsweise 

```
@XmlRootElement(name = "JavaFXApplication")
@XmlAccessorType(XmlAccessType.FIELD)
public class JavaFXApplication {
	@XmlElement(name = "GlobalSettings")
	private GlobalSettings globalSettings;
//...
```


----------



## sparefroh (14. Jan 2014)

Ok vielen Dank, dann werde ich versuchen es so zu machen 


Danke!


Noch eine kurze Frage, muss ich dann in der Klasse GlobalSettings auch was annotieren?



```
public class GlobalSettings {
    String connectionString;
    String user;
    String password;
}
```


----------



## turtle (14. Jan 2014)

Ja klar.
Zumindest den connectionString.


----------



## KSG9|sebastian (14. Jan 2014)

Ich finde den umgekehrten Weg angenehmer.

Erstell für die XML-Datei ein XSD-Schema..und aus dem XSD-Schema lässt du dir deine JAXB-Klassen generieren. Dann hast du auch gleich eine vernünftige Validierung für dein XML und das Schema ist relativ schnell erstellt.


----------



## sparefroh (14. Jan 2014)

Klar stimmt, danke turtle!

Nja Jaxb finde ich sehr gut, da ich in weiterer Folge auch aus den Objekten ganz einfach eine XML Datei erzeugen kann!

Lg


----------



## sparefroh (14. Jan 2014)

So habe es jetzt alles annotiert usw. aber muss leider mitteilen da es nicht funktioniert :/

Folgende Fehlermeldung/Exception wird geworfen.


```
e = (com.sun.xml.bind.v2.runtime.IllegalAnnotationsException) com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 10 counts of IllegalAnnotationExceptions
javafx.util.Callback ist eine Schnittstelle, und JAXB kann keine Schnittstellen verarbeiten.
    this problem is related to the following location:
        at javafx.util.Callback
        at public final javafx.util.Callback javafx.scene.control.TableView.getColumnResizePolicy()
        at javafx.scene.control.TableView
        at javafx.scene.control.TableView javafxapplication.FxPage.table
        at javafxapplication.FxPage
        at private java.util.List javafxapplication.main.XMLFxApplication.pages
        at javafxapplication.main.XMLFxApplication
```

Habe daraufhin ein wenig gegooglt und festgestellt das JAXB nicht kompatible mit JavaFX ist ...

Habt ihr vielleicht noch andere Vorschläge?

LG


----------



## NoXiD (15. Jan 2014)

wo hast du denn das gelesen dass javafx nicht mit jaxb compatibel sein soll? :O


----------



## sparefroh (15. Jan 2014)

Das hat mir mein Lehrer gesagt da es da zu Problemen mit den Interfaces kommt.

Daher habe ich es jetzt einfach mit JDOM gelöst.

Funktioniert wunderbar.


----------

