2008-11-10 6 views

ответ

52
marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", Boolean.FALSE); 

могут быть использованы, чтобы не

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

Однако я не Wouldnt рассмотреть эту лучшую практику.

+2

Спасибо, это именно то, что мне нужно. Я бы согласился, что лучше всего включить эту строку, но веб-сервис, с которым я взаимодействую, не ожидает этого. – jgrowl 2010-03-17 15:29:15

+6

Хорошо, что он работает, но FWIW, сервис не работает, если он не может принять легальный xml, поэтому, вероятно, полезно подать отчет об ошибке. – StaxMan 2011-01-08 08:05:26

+4

Не работает с JAXB в JDK1.6. См. Ответ so_mv для правильного решения. – sversch 2012-08-14 07:32:29

3

Если вы делаете документ зависимым от DOCTYPE (например, используете именованные объекты), то он перестанет быть автономным, поэтому standalone="yes" не будет разрешен в декларации XML.

Однако автономный XML можно использовать в любом месте (в то время как для анализаторов XML, которые не загружают внешние компоненты, не является автономным).

Я не вижу, как это заявление может быть проблемой, отличной от совместимости с программным обеспечением, которое не поддерживает XML, но некоторые сломанные доморощенные XML-подобные вуду.

99

в JAXB, который является частью JDK1.6

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE); 
52

Вы можете использовать

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

или

marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", Boolean.FALSE) 

отключить декларацию XML по умолчанию, а затем добавить свой пользовательская декларация XML,

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

от

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

к сгенерированной XML, таким образом избегая автономный = "Да" свойство.

2
jaxbMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE); 
jaxbMarshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders", "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>"); 

Это работало для меня с JDK1.7. standalone = \ "no \" можно удалить, чтобы получить только остальную часть xml

0

У меня нет достаточно высокой репутации, чтобы иметь «привилегию» для комментариев. ;-)

@Debasis, обратите внимание, что свойство вы указали:

"com.sun.xml.internal.bind.xmlHeaders" 

должно быть:

"com.sun.xml.bind.xmlHeaders" (without the "internal", which are not meant to be used by the public) 

Если я использую "внутреннее" свойство, как вы делали, я получаю a javax.xml.bind.PropertyException

3

только если кто-то еще struggeling с этой проблемой, вы можете рассмотреть возможность использования

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

, чтобы удалить все декларации XML и просто написать свой собственный String в начале вашего выходного потока/метода

2

Если вы используете только пакет javax.xml по умолчанию, вы можете установить параметр JAXB_FRAGMENT для маршаллера в значение «true» (это исключает инструкцию по обработке xml по умолчанию) и использовать метод writeProcessingInstruction для XMLStreamWriter для вставки собственных :

xmlStreamWriter.writeProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\""); 
jaxbMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE); 
jaxbMarshaller.marshal(object, xmlStreamWriter); 
xmlStreamWriter.writeEndDocument();