Знаете ли вы о настройке 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.
Вы можете использовать
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 = "yes" .
Если вы сделаете документ зависимым от DOCTYPE
(например, используете именованные сущности), он перестанет быть автономным, поэтому standalone="yes"
он не будет разрешен в декларации XML.
Однако автономный XML можно использовать где угодно, в то время как автономный является проблематичным для синтаксических анализаторов XML, которые не загружают внешние файлы.
Я не понимаю, как это объявление может быть проблемой, кроме как для взаимодействия с программным обеспечением, которое не поддерживает XML, а какой-то ужасный суп с регулярными выражениями.
DOCTYPE
?
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 по умолчанию, вы можете установить для параметра 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
У меня недостаточно высокой «репутации», чтобы иметь «привилегию» комментировать. ;-)
@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\"?>");