Ich möchte den Ausgabestream für eine JAXB-Marshalling-Operation ändern, um einige beliebige XML einzuschließen. Hier ist ein Beispiel, um die Situation zu klären.Wie kann ich den JAXB-Marshalling-Ausgabestream ändern, um beliebiges Inline-XML einzuschließen?
Ich habe eine beliebige Product
Domain-Objekt mit JAXB Annotationen, die derzeit wie folgt aussehen:
@XmlRootElement(name="Product")
public class Product {
@XmlElement(name="CommonProperty")
private String commonProperty="Something";
@XmlElement(name="ExtraXml")
private String extraXml="Something extra";
}
die in der Regel in dieser Marschall würde:
<Product>
<CommonProperty>Something</CommonProperty>
<ExtraXml>Something else</ExtraXml>
</Product>
Nun, was ist, wenn das extraXml
Feld einige enthalten zusätzliches XML (von beliebiger Komplexität), das inline mit dem endgültigen Marshall-Ergebnis enthalten sein sollte?
Say enthielt extraXml
„<abc><def>Something extra</def></abc>
“, würde ich wirklich wie eine Lösung, die es mir ermöglicht, Product
wie dieser Marschall (Formatierung optional):
<Product>
<CommonProperty>Something</CommonProperty>
<abc>
<def>Something extra</def>
</abc>
</Product>
Ich habe bei this related question aussehen, aber es hat nicht ganz ergibt das Ergebnis, das ich suche, da es eher auf eine Änderung des Gesamtformats als auf die DOM-Einfügung ausgerichtet ist.
Die Eigenschaft ist nur für die Illustration da, könnte es als @XmlTransient
oder in eine einzige spezialisierte Klasse markiert werden. Das einzige Kriterium ist, dass es irgendwie einen String
bekommen kann, der völlig willkürlichen XML-Inhalt zum Anhängen an die einzelne marshalled Ausgabe Product
enthält.
Ich sollte auch erwähnen, dass die Verbraucher der Ausgabe von diesem in der Lage sind, den willkürlichen Inhalt in einer Weise zu analysieren, die ihnen entspricht. Der Zweck ist hier, die Verarbeitung auf der Serverseite zu vereinfachen.
Vielen Dank im Voraus für jede Hilfe, die Sie anbieten können.
Hört sich vielversprechend an - könnten Sie etwas näher erläutern? –
@Gary, Ich habe meine Antwort aktualisiert, um zu erklären, wie dies mit @XmlAnyElement durchgeführt werden kann. –
+1 für Ihr großes Update - es ist eine große Hilfe (und herzlichen Glückwunsch zum 3K heute brechen). Es gibt ein letztes bisschen, wenn es Ihnen nichts ausmacht. Zu Beginn des Marshalling habe ich nur den 'extraXml' als String und eine Instanz von' Product', die von 'new Product()' erstellt wurde. Gibt es eine Möglichkeit, den Knoten in einer Weise zu spezifizieren, die JAXB gerne ausführt? –