JAXB - Удалить 'standalone = "yes" из созданного XML

Знаете ли вы о настройке JAXB, чтобы предотвратить создание standalone = "yes" в полученном XML?

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

Ответ 1

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

может использоваться без

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

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

Ответ 2

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

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

Ответ 3

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

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, что позволяет избежать свойства standalone = "yes" .

Ответ 4

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

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

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

Ответ 5

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

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

чтобы удалить все объявления XML и просто написать свой собственный String в начале потока/метода вывода

Ответ 6

Если вы используете только пакет 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();

Ответ 7

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

Ответ 8

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

@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)

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