2013-08-26 4 views
6

В настоящее время я использую следующий код, чтобы мобилизовывать объект в XML-строкуИзменение XML-заголовок, полученный с помощью ИАС JAXB

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, пытаясь решить проблему, но до сих пор мне не повезло. Может кто-нибудь, пожалуйста, дать мне некоторое представление о том, как получить желаемый заголовок у маршаллера 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 (Я Moxy свинец)

+2

я получаю 'PropertyException' при установке' sun' свойство , –

+0

На MOXy? Какую версию вы используете? –

+0

No MOxy. Я предположил, что свойство было использовано с реализацией Java. –

7

Это работало для меня

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

+3

«com.sun.xml.internal.bind.xmlHeaders» работает при использовании jaxb из jdk 1.8 (по крайней мере, на окнах с java 1.8.0_60) – dosw

Смежные вопросы