我希望在使用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做这个!
答案 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。