在解组期间使用 JAXB 格式化 XML

发布于 2024-07-26 04:19:03 字数 484 浏览 7 评论 0原文

我想在使用 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 过程是不可能的...知道如何在 unmarshal 过程期间(或之后)使用 JAXB 格式化 XML 字符串吗?

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

I want to format a XML document during unmarshal with JAXB.
Unmarshal looks like:

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

While marshaling one can format the code via:

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

But this isn´t possible for the unmarchal process... Any idea how I can format the XML string with JAXB during (or after) unmarshal process?

BTW: I read some posts here about pretty print, but I want to do it with JAXB!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

对风讲故事 2024-08-02 04:19:04

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

One way to do this, if you insist, is to use an XSLT Transformer, such as Saxon's, that supports "teeing," i.e. lets you transform a Source to two Result objects. I don't know why you call String#getBytes(); you should be creating a StringReader and pulling from that. The two destinations for your "tee" would be the "identity transform" (the default if you call TransformerFactory#newTransformer()) and the other would be JAXBResult.

命比纸薄 2024-08-02 04:19:03

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

it is logically senseless to format the xml code while unmarshalling it?

韬韬不绝 2024-08-02 04:19:03

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

If you want to log formatted XML corresponding to the XML that you just unmarshalled, you can simply remarshal the unmarshalled object back to XML, using the property you specified, ie.

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

On the other hand, if all you want to do is reformat the XML, you probably should be using JAXP instead of JAXB.

Saygoodbye 2024-08-02 04:19:03

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

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

I think there is no pretty print for Unmarshaller because the result of the JAXB unmarshaller is not an XML but a Java object. If you want to pretty print the resulting unmarshalled object better override the toString() method of the jaxb generated object. (This will be a messy solution since each time you generate the JAX binding classes you will haveto introduce the toString() method yourself.

Hmmm... I hope the future versions of JAXB will have a solution to this shortcoming, since it is important for logging, etc.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文