Unterschiedliche Datenstruktur XML <-> Java mappen

Andreas29

Bekanntes Mitglied
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:
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
 
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
 
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

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
Java:
@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 ?!
 
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 ?
 
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
 
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)
 
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.
 
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
 

Zurück
Oben