更改 JAXB 编组器生成的 XML 标头

新手上路,请多包涵

我目前正在使用以下代码将对象编组为 xml 字符串

    JAXBContext context;

    try {
        context = JAXBContext.newInstance(heartbeat.getClass());
        StringWriter writer = new StringWriter();
        Marshaller marshaller = context.createMarshaller();

        heartbeat.setHeader(header);
        heartbeat.setHeartbeatEvent(event);

        marshaller.marshal(heartbeat, writer);
        String stringXML = writer.toString();
        return stringXML;

    } catch (JAXBException e) {
        throw new RuntimeException("Problems generating XML in specified "
                + "encoding, underlying problem is " + e.getMessage(),
                e);
    }

产生以下标题

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

我想要的输出如下

<?xml version=\"1.0\"?>

通过将此添加到编组器

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.FALSE);
marshaller.setProperty("com.sun.xml.bind.xmlHeaders", "<?xml version=\"1.0\"?>");

我收到

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><?xml version="1.0"?>

并将 JAXB_FRAGMENT 属性更改为 TRUE 会完全删除标头。我一直在关注 JAXB - Remove ‘standalone=“yes”’ from generated XML thread 试图解决这个问题,但到目前为止我没有运气。有人可以给我一些关于如何从 JAXB 编组器获取所需标头的见解吗?

原文由 JME 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

当编组为 OutputStream 时,使用以下组合会产生预期的输出。

     marshaller.setProperty("com.sun.xml.bind.xmlHeaders", "<?xml version=\"1.0\"?>");
    marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);

当您编组到 Writer 时会出现您看到的问题,这似乎是 JAXB 参考实现中的错误。您可以通过以下链接提出问题:


你总是可以这样做:

 JAXBContext context;

try {
    context = JAXBContext.newInstance(heartbeat.getClass());
    StringWriter writer = new StringWriter();
    writer.append("<?xml version=\"1.0\"?>");
    Marshaller marshaller = context.createMarshaller();
    marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);

    heartbeat.setHeader(header);
    heartbeat.setHeartbeatEvent(event);

    marshaller.marshal(heartbeat, writer);
    String stringXML = writer.toString();
    return stringXML;

} catch (JAXBException e) {
    throw new RuntimeException("Problems generating XML in specified "
            + "encoding, underlying problem is " + e.getMessage(),
            e);
}


EclipseLink JAXB (MOXy) 还支持 com.sun.xml.bind.xmlHeaders 并且在编组到 Writer 时它可以正常工作(我是 MOXy 的负责人)

原文由 bdoughan 发布,翻译遵循 CC BY-SA 3.0 许可协议

这对我有用

marshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders", "<?xml version=\"1.0\" encoding=\"UTF-8\"?>");

原文由 Gopi Krishna 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题