Знаете ли вы о настройке JAXB, чтобы предотвратить создание standalone = "yes" в полученном XML?
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Знаете ли вы о настройке JAXB, чтобы предотвратить создание standalone = "yes" в полученном XML?
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", Boolean.FALSE);
может использоваться без
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Однако я бы не рассматривал эту лучшую практику.
в JAXB, который является частью JDK1.6
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
Вы можете использовать
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" .
Если вы создаете документ, зависящий от DOCTYPE
(например, используйте именованные объекты), он перестает быть автономным, поэтому standalone="yes"
не будет разрешено в декларации XML.
Однако автономный XML можно использовать в любом месте (в то время как нестандартное является проблематичным для синтаксических анализаторов XML, которые не загружают внешние).
Я не вижу, как это объявление может быть проблемой, отличной от интероперабельности с программным обеспечением, которое не поддерживает XML, но некоторые сломанные доморощенные XML-подобные voodoo.
если кто-то еще борется с этой проблемой, вы можете использовать
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
чтобы удалить все объявления XML и просто написать свой собственный String
в начале потока/метода вывода
Если вы используете только пакет 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();
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
У меня нет достаточно высокой репутации, чтобы иметь "привилегию" для комментариев.; -)
@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