2009-07-02 5 views
0

Ich möchte ein XML-Dokument während des Unmarshal mit JAXB formatieren. Abstellungs wie folgt aussehen:Format XML mit JAXB während unmarshal

Unmarshaller u = createAndsetUpUnmarshaller(enableValidation, evtHandler, clazz); 
return u.unmarshal(new ByteArrayInputStream(stringSource.getBytes())); 

Während Marshalling man den Code über formatieren können:

marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 

Aber diese isn't möglich, dass der unmarchal Prozess ... Irgendeine Idee, wie ich den XML-String formatiert werden kann mit JAXB während (oder nach) dem Unmarshal-Prozess?

BTW: Ich habe ein paar Posts gelesen über schöne Druck, aber ich möchte es mit JAXB tun!

+4

führt unmarshall nicht zu einer Objektinstanz? –

+0

ja tut es ... hm – Tobias

+0

Dann, was willst du formatieren? –

Antwort

27

ist es logisch sinnlos den xML-Code zu formatieren, während es unmarshalling?

+0

24 upvotes und akzeptiert ... erstaunlich. –

2

Ich denke, es gibt keinen schönen Druck für Unmarshaller, weil das Ergebnis des JAXB-Unmarshallers kein XML, sondern ein Java-Objekt ist. Wenn Sie das resultierende unmarshaled Objekt hübsch drucken möchten, überschreiben Sie besser die Methode toString() des von jaxb generierten Objekts. (Dies ist eine chaotische Lösung, da Sie jedes Mal, wenn Sie die JAX-Bindungsklassen generieren, die Methode toString() selbst einführen müssen.

Hmmm ... Ich hoffe, dass die zukünftigen Versionen von JAXB eine Lösung für dieses Manko haben werden, da ist es wichtig, für die Protokollierung usw.

0

eine Möglichkeit, dies zu tun, wenn Sie darauf bestehen, ist ein XSLT-Transformer, wie Saxon zu verwenden , die "Abschlag" unterstützt, dh Sie können eine Quelle in zwei Ergebnisobjekte umwandeln. Ich weiß nicht, warum Sie String # getBytes() aufrufen; Sie sollten einen StringReader erstellen und daraus ziehen. Die beiden Ziele für Ihr "Tee" wäre die "Identitätstransformation" (der Standard, wenn Sie TransformerFactory # newTransformer() aufrufen) und der andere wäre JAXBResult.

17

Wenn Sie XML formatieren möchten, das dem XML-Code entspricht, den Sie einfach entpackt haben, können Sie das unmarshalierte Objekt einfach wieder in XML umwandeln, indem Sie die angegebene Eigenschaft verwenden, d.

/** 
* Marshall input object to a formatted XML String 
*/ 
protected <T> String marshal(T input) throws JAXBException { 
    StringWriter writer = new StringWriter(); 

    JAXBContext jc = JAXBContext.newInstance(input.getClass()); 
    Marshaller marshaller = jc.createMarshaller(); 
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 
    marshaller.marshal(input, writer); 
    return writer.toString(); 
} 

Auf der anderen Seite, wenn alles, was Sie tun mögen, die XML ist umformatieren, sollten Sie wahrscheinlich statt JAXB mit JAXP sein.