簡體   English   中英

在unmarshal期間使用JAXB格式化XML

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM