Удалите 'standalone = "yes"' из сгенерированного XML

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

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

Почему это проблема?

Kornel 14.12.2008 21:56

@Kornel в моем проекте, что для использования с Tibco и WebMethod он вызовет ошибку, потому что standalone = yes не распознается

aswzen 26.07.2019 11:10
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
83
2
103 144
13
Перейти к ответу Данный вопрос помечен как решенный

Ответы 13

Ответ принят как подходящий

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

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

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

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

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

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

jgrowl 17.03.2010 18:29

Хорошо, что он работает, но FWIW, служба не работает, если она не может принять законный xml, поэтому, вероятно, хорошо подать отчет об ошибке против нее.

StaxMan 08.01.2011 11:05

Не работает с JAXB в JDK1.6. См. Ответ so_mv для правильного решения.

sversch 14.08.2012 11:32

Взрывается в полете: исключение.

Nicolas Barbulesco 24.04.2013 13:38

@sversch: вы можете попробовать класс свойств: "com.sun.xml.internal.bind.xmlHeaders"

baybora.oren 19.08.2013 16:27

@ baybora.oren "com.sun.xml.internal.bind.xmlHeaders" также не работает на Java 1.7.0_51 с javax.xml.bind.PropertyException.

Phil 05.12.2014 05:52

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

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

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

Собственно, любая якобы система обработки xml, которая блокирует объявление xml, кажется очень подозрительной.

StaxMan 08.01.2011 11:06

Каким образом он отвечает на вопрос?

ᄂ ᄀ 15.11.2014 10:37

Как сделать так, чтобы документ зависел от DOCTYPE?

Lii 04.09.2020 12:52

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

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);

Это не дает ожидаемого результата. Это удаляет всю строку объявления XML. Я хочу просто удалить атрибут standalone в объявлении XML.

Nicolas Barbulesco 24.04.2013 13:11

Если вам интересно, почему это не работает для вас, как и я, то ответ таков: эффект зависит от того, какой маршал API вы используете. Для маршалинга (Object, Outputstream) и marshal (Object, Writer) это работает, как предлагается здесь. Для маршала (Объект, Узел) это не действует. Остальные значения marshal api можно найти в здесь в разделе «Поддерживаемые свойства».

Lasse Samson 22.01.2015 17:50

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

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);

или же

marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", 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 = "да".

"SetProperty" с "xmlDeclaration" взрывается в полете: исключение.

Nicolas Barbulesco 24.04.2013 13:31

Строка «setProperty» с «xmlHeaders» также не работает. PropertyException. Так что это не выход.

Nicolas Barbulesco 24.04.2013 13:40

какую версию java и jaxb вы используете?

WarFox 24.04.2013 14:34

@WarFox Команда setProperty с xmlHeaders не работает с jdk1.6.0_24 и JAXB версии 2.1

Bryan Larson 11.09.2013 23:29

Независимо от java6 или java7 мне пришлось добавить 'internal', то есть marshaller.setProperty ("com.sun.xml.internal.bind.xmlHeaders‌", "<? Xml version = \" 1.0 \ "encoding = \" UTF- 8 \ "?>");

Caoilte 23.08.2014 23:12
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

ошибка: javax.xml.bind.PropertyException: имя: com.sun.xml.internal.bind.xmlHeaders значение: <? xml version = "1.0" encoding = "UTF-8"?>

aswzen 26.07.2019 12:00

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

@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

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

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();

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

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

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

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

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

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();
  }

Я использую 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\"?>");

Если у вас <?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\"?>");

Другие вопросы по теме