改變

2013-08-26 24 views
6

我目前使用以下代碼以對象封成一個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"?> 

我的期望的輸出是由JAXB編組產生XML頭以下

<?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線程,試圖解決這個問題,但目前我還沒有運氣。有人可以給我一些關於如何從JAXB編組獲得我想要的標題的見解嗎?

回答

13

使用以下組合編組爲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 (我是莫西鉛)

+2

我得到一個'PropertyException' 。 –

+0

關於MOXy?你正在使用哪個版本? –

+0

沒有MOxy。我認爲該屬性與Java實現一起使用。 –

7

設置`sun`屬性時,這爲我工作

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

+3

「com.sun.xml.internal.bind.xmlHeaders」在從jdk 1.8使用jaxb時起作用(至少在使用java 1.8.0_60的windows上) – dosw