Sorry, der Titel ist ziemlich allgemein. Aber die Fragen auch 
Ich würde gerne eine Objektstruktur als XML persistieren. Nachdem ein Kollege mich mal sehr entsetzt angesehen hat, als ich erwähnt hatte, das ich XML bisher mit DOM verarbeitet habe, hatte ich in betracht gezogen, es diesmal mit einer richtigen Schemadefinition und JAXB zu lösen. Ein paar Fragen dazu (und darüber hinaus):
1. Wenn die Objekte, die dort persistiert werden sollen, Implementierungen eines Modell-Interfaces sind, muss man die Übersetzung von dem, was mit den per JAXB generierten Klassen aus dem XML gelesen wird doch per Hand machen, ist das richtig? Also als Beispiel
Irgendwie erscheint mir das ziemlich "von hinten durch die Brust ins Auge" ???:L Viel einfacher, als die "Person" direkt aus dem DOM-Node zu bauen, ist das auch nicht - im Gegenteil, es entsteht ein gewaltiger Overhead. Wenn die Möglicheit zur Validierung der einzige Vorteil ist, der sich daraus ergibt ... würde ich mir das eher sparen... :noe:
2. Etwas einfacher sollte es ja sein, wenn das, was man persistiert, Beans sind. Bei mir ist es aber so, dass die eigentlichen Modellklassen KEINE Beans sind, aber ggf. Beans enthalten. Grob im Sinne von
Wie kann man die beiden Konzepte verheiraten? Über Schemadefinition und JAXB sieht's da (soweit ich das bisher überblicke) dünn aus: Das, was in der Bean steht, sollte ja NICHT Teil der Schemadefinition sein. (Irgendeine Möglichkeit, in der XSD zu sagen: "Da ist ein Knoten, den du ignorieren kannst" wird es wohl geben - ich frage mich nur, ob das sinnvoll ist).
3. Unabhängig davon, ob die Bean nun Teil der XSD ist oder nicht: Wie kann man aus einem Bean-DOM-Knoten eine Bean erzeugen? Als ich gesehen habe, dass 'XMLDecoder' zwingend einen InputStream braucht, bin ich beinahe abgebrochen :noe: Es kann doch nicht sein, dass man sein schon zu einem DOM-Knoten geparstes XML erst wieder in einen String rausschreiben muss, damit man ihn als InputStream an den XMLDecoder weiterreichen und dort wieder "neu" einlesen kann?! ???:L
3a. Als Alternative, was vielleicht nicht verkehrt wäre: Sollte man den Bean-Teil vielleicht einfach als externe, eigenständige XML-Datei ablegen? Wenn ja, gibt es dafür einen Standard oder eine best practice? Erstellt in so einem Fall jeder seine eigene, "proprietäre" Verlinkung wie
<externalBeanFile name="AddressBean00001.xml" />
die dann entsprechend (wieder komplett manuell) eingelesen wird? Eine Websuche brachte erstmal nur sowas wie XInclude, aber ... das fällt ja weg, das liefert ja wieder nur einen DOM-Node...
Vielleicht kann ja jemand ein bißchen Licht in die Sache bringen....
Ich würde gerne eine Objektstruktur als XML persistieren. Nachdem ein Kollege mich mal sehr entsetzt angesehen hat, als ich erwähnt hatte, das ich XML bisher mit DOM verarbeitet habe, hatte ich in betracht gezogen, es diesmal mit einer richtigen Schemadefinition und JAXB zu lösen. Ein paar Fragen dazu (und darüber hinaus):
1. Wenn die Objekte, die dort persistiert werden sollen, Implementierungen eines Modell-Interfaces sind, muss man die Übersetzung von dem, was mit den per JAXB generierten Klassen aus dem XML gelesen wird doch per Hand machen, ist das richtig? Also als Beispiel
Java:
// Modell:
interface Person
{
String getName();
int getAge();
}
// Factory zum Erstellen von Instanzen
class Persons
{
public static Person create(String name, int age) { ... }
}
// XML
<person>
<name>Bla</name>
<age>42</age>
</person>
// Automatisch per JAXB generierte "Typ-Klasse"
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "PersonType", propOrder = {...})
public class PersonType
{
@XmlElement(required = true)
protected String name;
@XmlElement(required = true)
protected int age;
...
}
// Übersetzung nach dem Einlesen:
Person read(InputStream inputStream)
{
PersonType personType = readWithJaxb(inputStream);
return Persons.create(personType.getName(), personType.getAge());
}
2. Etwas einfacher sollte es ja sein, wenn das, was man persistiert, Beans sind. Bei mir ist es aber so, dass die eigentlichen Modellklassen KEINE Beans sind, aber ggf. Beans enthalten. Grob im Sinne von
Java:
// Modell:
interface Person
{
String getName();
int getAge();
Address getAddress(); // Das ist eine Bean
}
3. Unabhängig davon, ob die Bean nun Teil der XSD ist oder nicht: Wie kann man aus einem Bean-DOM-Knoten eine Bean erzeugen? Als ich gesehen habe, dass 'XMLDecoder' zwingend einen InputStream braucht, bin ich beinahe abgebrochen :noe: Es kann doch nicht sein, dass man sein schon zu einem DOM-Knoten geparstes XML erst wieder in einen String rausschreiben muss, damit man ihn als InputStream an den XMLDecoder weiterreichen und dort wieder "neu" einlesen kann?! ???:L
3a. Als Alternative, was vielleicht nicht verkehrt wäre: Sollte man den Bean-Teil vielleicht einfach als externe, eigenständige XML-Datei ablegen? Wenn ja, gibt es dafür einen Standard oder eine best practice? Erstellt in so einem Fall jeder seine eigene, "proprietäre" Verlinkung wie
<externalBeanFile name="AddressBean00001.xml" />
die dann entsprechend (wieder komplett manuell) eingelesen wird? Eine Websuche brachte erstmal nur sowas wie XInclude, aber ... das fällt ja weg, das liefert ja wieder nur einen DOM-Node...
Vielleicht kann ja jemand ein bißchen Licht in die Sache bringen....