更改JAXB marshaller生成的XML标头

JME*_*JME 8 java jaxb

我目前正在使用以下代码将对象编组为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);
    }
Run Code Online (Sandbox Code Playgroud)

这会产生以下标题

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Run Code Online (Sandbox Code Playgroud)

我想要的输出如下

<?xml version=\"1.0\"?>
Run Code Online (Sandbox Code Playgroud)

通过将此添加到编组器

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

我收到

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><?xml version="1.0"?>
Run Code Online (Sandbox Code Playgroud)

并将JAXB_FRAGMENT属性更改为TRUE将完全删除标头.我一直关注JAXB - 从生成的XML线程中删除'standalone ="yes"'试图解决问题,但到目前为止我没有运气.有人可以给我一些关于如何从JAXB marshaller获取所需标题的见解吗?

bdo*_*han 18

OutputStream使用以下组合编组到a时会产生预期输出.

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

当您编组到a时,您看到的问题就出现了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);
}
Run Code Online (Sandbox Code Playgroud)

EclipseLink JAXB(MOXy)也支持它com.sun.xml.bind.xmlHeaders并且在编组时它可以正常工作Writer(我是MOXy主管)

  • 设置`sun`属性时我得到一个`PropertyException`. (2认同)

Gop*_*hna 7

这对我有用

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

  • "com.sun.xml.internal.bind.xmlHeaders"在使用jdk 1.8中的jaxb时起作用(至少在带有java 1.8.0_60的windows上) (3认同)