Знаете ли вы о настройке JAXB, предотвращающей создание standalone="yes" в результирующем XML?
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Знаете ли вы о настройке JAXB, предотвращающей создание standalone="yes" в результирующем XML?
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Это свойство:
marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", false);
... можно использовать, чтобы не иметь:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Однако я бы не стал рассматривать эту передовую практику.
в JAXB, который является частью JDK1.6
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
standalone в объявлении XML.
- person Nicolas Barbulesco; 24.04.2013
Вы можете либо использовать
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.
просто если кто-то еще борется с этой проблемой, вы можете рассмотреть возможность использования
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
чтобы удалить всю декларацию XML и просто написать свой собственный String в начале вашего выходного потока/метода
Если вы сделаете документ зависимым от DOCTYPE (например, используете именованные объекты), он перестанет быть автономным, поэтому standalone="yes" не будет разрешено в объявлении XML.
Однако автономный XML можно использовать где угодно, в то время как неавтономный создает проблемы для синтаксических анализаторов XML, которые не загружают внешние файлы.
Я не понимаю, как это объявление может быть проблемой, кроме как для взаимодействия с программным обеспечением, которое не поддерживает XML, а какой-то ужасный суп с регулярными выражениями.
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();
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
Вы можете использовать: marshaller.setProperty("jaxb.fragment", Boolean.TRUE);
У меня работает на Java 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
Если вы получаете исключение свойства, добавьте следующую конфигурацию:
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);
Я использую 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\"?>");
просто попробуй
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();
}
Если у вас есть <?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\"?>");