在unmarshal期间使用JAXB格式化XML

时间:2009-07-02 12:28:40

标签: java xml jaxb pretty-print

我希望在使用JAXB解组时格式化XML文档。 Unmarshal看起来像:

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

虽然编组可以通过以下方式格式化代码:

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

但这对于unmarchal进程是不可能的......任何想法如何在解组过程中(或之后)使用JAXB格式化XML字符串?

顺便说一句:我在这里看了一些关于漂亮打印的帖子,但我想用JAXB做这个!

4 个答案:

答案 0 :(得分:37)

在解组时格式化xml代码在逻辑上毫无意义吗?

答案 1 :(得分:21)

如果要记录与您刚刚解组的XML相对应的格式化XML,您可以使用您指定的属性将解组的对象简单地重新编组回XML,即

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

另一方面,如果您只想重新格式化XML,那么您可能应该使用JAXP而不是JAXB。

答案 2 :(得分:3)

我认为Unmarshaller没有漂亮的印刷品,因为JAXB unmarshaller的结果不是XML而是Java对象。如果你想打印生成的unmarshalled对象更好地覆盖jaxb生成的对象的toString()方法。 (这将是一个混乱的解决方案,因为每次生成JAX绑定类时,您都必须自己引入toString()方法。

嗯...我希望JAXB的未来版本能够解决这个缺点,因为它对于日志记录等非常重要。

答案 3 :(得分:0)

如果你坚持的话,一种方法是使用支持“teeing”的XSLT Transformer,例如Saxon,即允许你将Source转换为两个Result对象。我不知道为什么你调用String#getBytes();你应该创建一个StringReader并从中拉出来。你的“tee”的两个目的地是“身份变换”(默认情况下,如果你调用TransformerFactory#newTransformer()),另一个目标是JAXBResult。