Удалить 'standalone = "yes"' из сгенерированного XML - PullRequest
76 голосов
/ 10 ноября 2008

Знаете ли вы о настройке JAXB для предотвращения генерации standalone = "yes" в результирующем XML?

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

Ответы [ 10 ]

117 голосов
/ 01 ноября 2010

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

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
57 голосов
/ 09 декабря 2008
marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", Boolean.FALSE);

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

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

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

56 голосов
/ 25 марта 2011

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

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" .

6 голосов
/ 07 ноября 2016

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

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

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

4 голосов
/ 24 декабря 2008

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

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

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

3 голосов
/ 10 августа 2016
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

2 голосов
/ 10 апреля 2018

Вы можете использовать: marshaller.setProperty ("jaxb.fragment", Boolean.TRUE);

У меня работает на Java 8

2 голосов
/ 03 мая 2017

Если вы используете только пакет 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();
0 голосов
/ 10 февраля 2019

Если вы получаете исключение свойства, добавьте следующую конфигурацию:

jaxbMarshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders",
              "<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
jaxbMarshaller.setProperty("com.sun.xml.internal.bind.xmlDeclaration", Boolean.FALSE);
jaxbMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);  
0 голосов
/ 22 сентября 2016

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

@ 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

...