Знаете ли вы о настройке JAXB, предотвращающей создание standalone = "да" в результирующем XML?
<?xml version = "1.0" encoding = "UTF-8" standalone = "yes"?>
@Kornel в моем проекте, что для использования с Tibco и WebMethod он вызовет ошибку, потому что standalone = yes не распознается





Это свойство:
marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", false);
... может использоваться, чтобы не было:
<?xml version = "1.0" encoding = "UTF-8" standalone = "yes"?>
Однако я бы не стал рассматривать эту лучшую практику.
Спасибо, это именно то, что мне нужно. Я согласен, что лучше всего включать эту строку, но веб-служба, с которой я взаимодействую, этого не ожидает.
Хорошо, что он работает, но FWIW, служба не работает, если она не может принять законный xml, поэтому, вероятно, хорошо подать отчет об ошибке против нее.
Не работает с JAXB в JDK1.6. См. Ответ so_mv для правильного решения.
Взрывается в полете: исключение.
@sversch: вы можете попробовать класс свойств: "com.sun.xml.internal.bind.xmlHeaders"
@ baybora.oren "com.sun.xml.internal.bind.xmlHeaders" также не работает на Java 1.7.0_51 с javax.xml.bind.PropertyException.
Если вы сделаете документ зависимым от DOCTYPE (например, используете именованные сущности), он перестанет быть автономным, поэтому standalone = "yes" не будет разрешен в декларации XML.
Однако автономный XML можно использовать где угодно, в то время как автономный является проблематичным для синтаксических анализаторов XML, которые не загружают внешние файлы.
Я не понимаю, как это объявление может быть проблемой, кроме как для взаимодействия с программным обеспечением, которое не поддерживает XML, а для какого-то ужасного супа с регулярными выражениями.
Собственно, любая якобы система обработки xml, которая блокирует объявление xml, кажется очень подозрительной.
Каким образом он отвечает на вопрос?
Как сделать так, чтобы документ зависел от DOCTYPE?
в JAXB, который является частью JDK1.6
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
Это не дает ожидаемого результата. Это удаляет всю строку объявления XML. Я хочу просто удалить атрибут standalone в объявлении XML.
Если вам интересно, почему это не работает для вас, как и я, то ответ таков: эффект зависит от того, какой маршал API вы используете. Для маршалинга (Object, Outputstream) и marshal (Object, Writer) это работает, как предлагается здесь. Для маршала (Объект, Узел) это не действует. Остальные значения marshal api можно найти в здесь в разделе «Поддерживаемые свойства».
Вы можете использовать
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" взрывается в полете: исключение.
Строка «setProperty» с «xmlHeaders» также не работает. PropertyException. Так что это не выход.
какую версию java и jaxb вы используете?
@WarFox Команда setProperty с xmlHeaders не работает с jdk1.6.0_24 и JAXB версии 2.1
Независимо от java6 или java7 мне пришлось добавить 'internal', то есть marshaller.setProperty ("com.sun.xml.internal.bind.xmlHeaders", "<? Xml version = \" 1.0 \ "encoding = \" UTF- 8 \ "?>");
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"?>
У меня недостаточно высокая «репутация», чтобы иметь «привилегию» комментировать. ;-)
@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\"?>");
Почему это проблема?