Знаете ли вы настройку JAXB, чтобы предотвратить standalone = "yes" из сгенерированного в результате XML?JAXB - Удалить 'standalone = "yes"' из сгенерированного XML
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Знаете ли вы настройку JAXB, чтобы предотвратить standalone = "yes" из сгенерированного в результате XML?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"?>
Однако я не Wouldnt рассмотреть эту лучшую практику.
Спасибо, это именно то, что мне нужно. Я бы согласился, что лучше всего включить эту строку, но веб-сервис, с которым я взаимодействую, не ожидает этого. – jgrowl 2010-03-17 15:29:15
Хорошо, что он работает, но FWIW, сервис не работает, если он не может принять легальный xml, поэтому, вероятно, полезно подать отчет об ошибке. – StaxMan 2011-01-08 08:05:26
Не работает с JAXB в JDK1.6. См. Ответ so_mv для правильного решения. – sversch 2012-08-14 07:32:29
Если вы делаете документ зависимым от DOCTYPE
(например, используете именованные объекты), то он перестанет быть автономным, поэтому standalone="yes"
не будет разрешен в декларации XML.
Однако автономный XML можно использовать в любом месте (в то время как для анализаторов XML, которые не загружают внешние компоненты, не является автономным).
Я не вижу, как это заявление может быть проблемой, отличной от совместимости с программным обеспечением, которое не поддерживает XML, но некоторые сломанные доморощенные XML-подобные вуду.
в 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, таким образом избегая автономный = "Да" свойство.
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)
Если я использую "внутреннее" свойство, как вы делали, я получаю a javax.xml.bind.PropertyException
только если кто-то еще struggeling с этой проблемой, вы можете рассмотреть возможность использования
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();
Почему это проблема? – Kornel 2008-12-14 18:56:55