10

我想在使用 JAXB 解组期间格式化 XML 文档。解组看起来像:

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

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

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

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

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

4

4 回答 4

43

在解组时格式化 xml 代码在逻辑上是没有意义的吗?

于 2010-09-24T13:34:12.380 回答
25

如果您想记录与您刚刚解组的 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。

于 2013-03-18T09:08:32.543 回答
3

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

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

于 2010-09-14T06:02:13.897 回答
0

如果您坚持的话,一种方法是使用 XSLT 转换器,例如 Saxon 的,它支持“teeing”,即让您将 Source 转换为两个 Result 对象。我不知道你为什么叫 String#getBytes(); 您应该创建一个 StringReader 并从中提取。您的“tee”的两个目的地是“身份转换”(如果您调用 TransformerFactory#newTransformer(),则为默认值),另一个是 JAXBResult。

于 2011-05-15T19:12:42.520 回答