[英]Format XML with JAXB during unmarshal
我想在使用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做到這一點!
在解組它時格式化xml代碼在邏輯上毫無意義嗎?
如果要記錄與您剛剛解組的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。
我認為Unmarshaller沒有漂亮的打印,因為JAXB unmarshaller的結果不是XML而是Java對象。 如果你想打印生成的unmarshalled對象更好地覆蓋jaxb生成的對象的toString()方法。 (這將是一個混亂的解決方案,因為每次生成JAX綁定類時,您都必須自己引入toString()方法。
嗯...我希望JAXB的未來版本能夠解決這個缺點,因為它對於日志記錄等非常重要。
如果你堅持的話,一種方法是使用支持“teeing”的XSLT Transformer,例如Saxon,即允許你將Source轉換為兩個Result對象。 我不知道為什么你調用String#getBytes(); 你應該創建一個StringReader並從中拉出來。 你的“tee”的兩個目的地是“身份變換”(默認情況下,如果你調用TransformerFactory#newTransformer()),另一個目標是JAXBResult。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.