Ich habe ein ziemlich komplexes JAXB-Tree-Objekt. Für jeden Blattknoten muss ich seinen tatsächlichen Wert filtern
z. B.
%Vor% Die Blattknoten hier wären Title
, author
und Date
.
Stellen Sie sich vor, ich brauche ein Marshalled-Dokument für dieses JAXB-Modell, wobei das erste Zeichen für jeden Blattknoten entfernt wird :
Was ist der beste Ansatz?
Ich sehe zwei Startpunkte, aber ich bin derzeit stecken.
1. Führen Sie die Änderung im JAXB-Modell durch
Gibt es einen Traversal-Mechanismus, mit dem ich die Blattelemente eines beliebigen JAXB-Objekts (irgendeine Art von Besuchermuster oder etwas) erhalten kann?
2. In das Marshalling einsteigen
Vielleicht können wir beim Marshalling einspringen, z. mit einem XMLStreamWriter
..
Gibt es eine elegante Lösung für diese Art von Problem?
Ein anderer Ansatz, der auf einem Decorator vom Typ XMLStreamWriter
basiert, der einfach das erste Zeichen eines Textinhalts überspringt, Sie jedoch nicht nur auf Blattknoten beschränken können, wird dies tun wenden Sie die gleiche Logik auf alle Textinhalte nicht nur der Blattknoten an, was kein Problem darstellt, wenn Ihr Marshalling keine gemischten Inhalte erzeugt, wie in Ihrem Beispiel. Wenn Sie keinen gemischten Inhalt haben (Textinhalt und Knoten zusammen), können nur Blattknoten einen Textinhalt haben.
Ihr Dekorateur könnte etwa so aussehen:
%Vor%Dann wäre Ihr Code:
%Vor% Sie könnten das resultierende XML
nachbearbeiten , um das erste Zeichen des Textinhalts der einzelnen Blattknoten zu entfernen, indem Sie XSLT
mit dem nächsten Stylesheet verwenden:
Je nach der Größe des resultierenden XML
können Sie entweder das Ergebnis im Speicher behalten, bevor Sie das Stylesheet anwenden oder zuerst die resultierende XML
in eine temporäre Datei speichern.
So könnte Ihr Code davon ausgehen, dass der resultierende XML
in den Speicher passen kann:
Ausgabe:
%Vor%Tags und Links java xml jaxb marshalling