Удалить «standalone=yes» из сгенерированного XML

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

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

person Johan Pelgrim    schedule 10.11.2008    source источник
comment
Почему это проблема?   -  person Kornel    schedule 14.12.2008
comment
@Kornel в моем проекте, чтобы привыкнуть к Tibco и WebMethod, выдаст ошибку, потому что standalone=yes не распознан   -  person aswzen    schedule 26.07.2019


Ответы (13)


Это свойство:

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

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

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

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

person Sam    schedule 09.12.2008
comment
Спасибо, это именно то, что мне было нужно. Я согласен, что лучше всего включить строку, но веб-служба, с которой я взаимодействую, этого не ожидает. - person jgrowl; 17.03.2010
comment
Хорошо, что он работает, но FWIW, сервис не работает, если он не может принять легальный xml, так что, вероятно, лучше отправить отчет об ошибке. - person StaxMan; 08.01.2011
comment
Не работает с JAXB в JDK1.6. Смотрите ответ so_mv для правильного решения. - person sversch; 14.08.2012
comment
Это взрывается в полете: исключение. - person Nicolas Barbulesco; 24.04.2013
comment
@sversch: вы можете попробовать класс свойств: com.sun.xml.internal.bind.xmlHeaders - person baybora.oren; 19.08.2013
comment
@baybora.oren com.sun.xml.internal.bind.xmlHeaders также не работает на Java 1.7.0_51 с javax.xml.bind.PropertyException. - person Phil; 05.12.2014

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

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
person so_mv    schedule 01.11.2010
comment
Это не дает ожидаемого результата. Это удаляет всю строку объявления XML. Я хочу просто удалить атрибут standalone в объявлении XML. - person Nicolas Barbulesco; 24.04.2013
comment
Если вам интересно, почему это не работает для вас, как и я, то ответ таков: эффект зависит от того, какой маршал API вы используете. Для marshal(Object,Outputstream) и marshal(Object,Writer) это работает, как предложено здесь. Для marshal(Object, Node) это не имеет никакого эффекта. Для остальных последствий маршала API посмотрите здесь в разделе Поддерживаемые свойства. - person Lasse Samson; 22.01.2015

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

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);

or

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

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

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

by

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

в сгенерированный xml, избегая, таким образом, свойства standalone=yes.

person WarFox    schedule 25.03.2011
comment
SetProperty с xmlDeclaration взрывается во время полета: исключение. - person Nicolas Barbulesco; 24.04.2013
comment
Строка setProperty с xmlHeaders также не работает. Исключение свойства. Так что это не решение. - person Nicolas Barbulesco; 24.04.2013
comment
какую версию java и jaxb вы используете? - person WarFox; 24.04.2013
comment
@WarFox Команда setProperty с xmlHeaders не работает с jdk1.6.0_24 и JAXB версии 2.1. - person Bryan Larson; 11.09.2013
comment
Независимо от java6 или java7 мне пришлось добавить «внутренний», т.е. marshaller.setProperty(com.sun.xml.internal.bind.xmlHeaders, ‹?xml version=\1.0\coding=\UTF-8\?›); - person Caoilte; 23.08.2014

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

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

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

person benez    schedule 07.11.2016

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

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

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

person Kornel    schedule 24.12.2008
comment
Точно, любая система, предположительно обрабатывающая xml, которая отказывается от объявления xml, кажется весьма подозрительной. - person StaxMan; 08.01.2011
comment
Каким образом оно отвечает на вопрос? - person ᄂ ᄀ; 15.11.2014
comment
Как заставить документ зависеть от DOCTYPE? - person Lii; 04.09.2020

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

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

person Debasis Das    schedule 10.08.2016
comment
ошибка: javax.xml.bind.PropertyException: имя: com.sun.xml.internal.bind.xmlHeaders значение: ‹?xml версия=1.0 кодировка=UTF-8?› - person aswzen; 26.07.2019

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

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

person William Funchal Pereira    schedule 10.04.2018

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

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

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

person Ari    schedule 21.09.2016

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

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);  
person Alisha Setia    schedule 10.02.2019

Я использую Java 1.8 и JAXB 2.3.1.

Во-первых, обязательно используйте java 1.8 в pom.xml.

<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>

Затем в исходном коде я использовал: (ключ был внутренней частью)

// remove standalone=yes
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
marshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders", "<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
person Cesar    schedule 27.11.2019

просто попробуй

private String marshaling2(Object object) throws JAXBException, XMLStreamException {
    JAXBContext jaxbContext = JAXBContext.newInstance(object.getClass());
    Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
    jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    jaxbMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
    StringWriter writer = new StringWriter();
    writer.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
    jaxbMarshaller.marshal(object, writer);
    return writer.toString();
  }
person Bernardo Mello    schedule 06.08.2019

Если у вас есть <?xml version="1.0" encoding="UTF-8" standalone="yes"?>

но хочу это: <?xml version="1.0" encoding="UTF-8"?>

Просто делать:

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
marshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders", "<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
person Baked Inhalf    schedule 20.03.2020