# Unterschiedliche Datenstruktur XML <-> Java mappen



## Andreas29 (11. Aug 2011)

Hi,

ich habe eine fest vorgegebene XML und Java Datenstruktur, die leider, leider nicht zueinander passen. Ich muss aber in beide Richtungen mappen. Mal ein Beispiel:

XML:
[XML]
<root>
    <child>
        <childchild>Text</childchild>
    <child>
</root>
[/XML]

Java:

```
@XmlRootElement(root)
public class Root {
    @XmlElement(???)
    private String childchild;
```

Sprich, in meiner XML-Datenstruktur gib es Zwischenebenen, die es in meiner Javawelt nicht gibt. Momentan generiere ich mir ein passgenaues Datenmodell mittels JAXB und kopiere dann die Daten in Java zwischen den beiden Datenmodellen hin und her. Das empfinde ich als unschöne Lösung. Ich würde gerne wissen, ob ich JAXB irgendwie sagen kann, dass er den Wert für childchild nicht direkt unter dem root-Element sucht, sondern innerhalb von child und das ganze ohne dass ich eine Java-Klasse child habe. Funktioniert das? Kann mir da irgendwer helfen?

Danke und Grüße sowie schönen Feierabend,
Andreas


----------



## Wildcard (11. Aug 2011)

Wenn du statt Jaxb EMF nimmst, kannst du dafür derived features verwenden.


----------



## RySa (12. Aug 2011)

Stichwort:  *XPath*

//childchild - Selects all childchild elements no matter where they are in the document

root//childchild - Selects all childchild elements that are descendant of the root element, no matter where they are under the root element

child - Selects all the child nodes of the child element


----------



## eRaaaa (12. Aug 2011)

RySa hat gesagt.:


> Stichwort:  *XPath*
> 
> //childchild - Selects all childchild elements no matter where they are in the document
> 
> ...



Und wie hilft ihm jetzt diese Antwort weiter? @XmlPath wie in EclipseLink MOXy würde helfen, das gibts aber soweit ich weiss normal nicht oder? Damit ginge so etwas wie

```
@XmlRootElement(name="root")
@XmlAccessorType(XmlAccessType.FIELD)
 class Root {

	@XmlPath("/child/childchild/text()")
	private String childchild;
}
```

Ansonsten vlt einfach eine statische innere Klasse? ElementWrapper? (hättest dann aber eben eine Liste mit 1 String ) 

Aber vlt ergänzt RySa ja noch was zu seinem Post ?!


----------



## RySa (12. Aug 2011)

> Ich würde gerne wissen, ob ich JAXB irgendwie sagen kann, dass er den Wert für childchild nicht direkt unter dem root-Element sucht, sondern innerhalb von child und das ganze ohne dass ich eine Java-Klasse child habe. Funktioniert das? Kann mir da irgendwer helfen?



Also falls JAXB XPath nicht unterstützt, dann bestimmt so etwas ähnliches (wie du, eRaaaa, schon geschrieben hast) XmlPath ? 
Ich denke auf die von mir zitierte Frage ist die Antwort doch zumindest als "Anregung" verständlich/klar/hilfreich, oder etwa nicht ?


----------



## eRaaaa (12. Aug 2011)

RySa hat gesagt.:


> Ich denke auf die von mir zitierte Frage ist die Antwort doch zumindest als "Anregung" verständlich/klar/hilfreich, oder etwa nicht ?



Nicht wirklich, mir zumindest würdest du jetzt nicht helfen. Gib doch vlt mal ein Beispiel


----------



## Andreas29 (14. Aug 2011)

Hi,

also ein Beispiel wäre wirklich nicht schlecht. Aber die Anregung mit dem XPath werde ich morgen gleich ausprobieren. Aber soweit ich informiert bin (bitte keine Steinung, wenn ich jetzt Blödsinn erzähle... ) unterstützt JAXB kein XPath. Leider, sonst wäre es eine gute Möglichkeit. Bin momentan dabei, mir einen eigene Parser zu schreiben. Das Auslesen ist auch nicht das Problem, das war schnell runtercodiert. Jetzt muss ich noch das Rausschreiben coden, dass dürfte ein wenig schwerer werden...

Grüße und nochmals Danke!
Andreas


----------



## eRaaaa (14. Aug 2011)

Andreas29 hat gesagt.:


> Aber soweit ich informiert bin (bitte keine Steinung, wenn ich jetzt Blödsinn erzähle... ) unterstützt JAXB kein XPath. Leider, sonst wäre es eine gute Möglichkeit.



Eben, der Meinung war ich ja auch, deshalb hatte ich ja nochmal nachgehakt, ob RySa da mehr Informationen hat  
Aber wie ich schon schrieb könntest du EclipseLink MOxy verwenden (der o.g. Code sollte dann funktionieren)


----------



## RySa (15. Aug 2011)

Also da war ich mir genauso nicht sicher ob das geht. Aber muss es denn unbedingt JAXB sein ? Falls du auf JAXB, aus welchem Grund auch immer, doch bestehen solltest, habe ich mal so etwas gefunden, sollte sich JXPath nennen. Weiß nicht ob es deinen Anforderungen entsprechen wird, da ich momentan keine Zeit habe mich da in die API einzuarbeiten. Kannst aber vielleicht versuchen:
Apache Commons Jxpath.


----------



## Andreas29 (15. Aug 2011)

Hi,

ich habe mich jetzt mit Eclipse Link Moxy auseinandergesetzt und es erfüllt meine Bedingungen voll und ganz. Danke für den Tipp.

Grüße,
Andreas


----------

