11 Stimmen

Formatierung von XML mit JAXB während des Unarshal

Ich möchte ein XML-Dokument während des unmarshal mit JAXB formatieren. Unmarshal sieht so aus:

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

Beim Marshaling kann man den Code über formatieren:

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

Aber dies ist nicht möglich für den unmarchal Prozess... Irgendeine Idee, wie ich die XML-Zeichenfolge mit JAXB während (oder nach) unmarshal Prozess formatieren kann?

BTW: Ich habe hier einige Beiträge über pretty print gelesen, aber ich möchte es mit JAXB machen!

44voto

subes Punkte 1816

Es logisch unsinnig ist, den Xml-Code zu formatieren, während man ihn entmarshallt?

25voto

Justin Rowe Punkte 2216

Wenn Sie formatiertes XML protokollieren möchten, das dem XML entspricht, das Sie gerade entpackt haben, können Sie das entpackte Objekt einfach wieder in XML umwandeln, indem Sie die von Ihnen angegebene Eigenschaft verwenden, z. B.

/**
 * 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();
}

Wenn Sie hingegen nur das XML neu formatieren wollen, sollten Sie JAXP statt JAXB verwenden.

3voto

Isuru Sampath Punkte 31

Ich denke, es gibt keinen hübschen Ausdruck für Unmarshaller, weil das Ergebnis des JAXB Unmarshallers kein XML, sondern ein Java-Objekt ist. Wenn Sie das resultierende Unmarshaller-Objekt hübsch ausdrucken wollen, überschreiben Sie besser die toString()-Methode des von JAXB generierten Objekts. (Dies ist eine umständliche Lösung, da Sie jedes Mal, wenn Sie die JAX-Bindungsklassen generieren, die toString()-Methode 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 es für die Protokollierung usw. wichtig ist.

0voto

Tony Nassar Punkte 1

Eine Möglichkeit, dies zu tun, wenn Sie darauf bestehen, ist die Verwendung eines XSLT-Transformers, wie z.B. von Saxon, der "Teing" unterstützt, d.h. Sie können eine Quelle in zwei Ergebnisobjekte transformieren. Ich weiß nicht, warum Sie String#getBytes() aufrufen; Sie sollten einen StringReader erstellen und von diesem abrufen. Die beiden Ziele für Ihr "T-Stück" wären die "Identitäts-Transformation" (der Standard, wenn Sie TransformerFactory#newTransformer() aufrufen) und das andere wäre JAXBResult.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X