Чи знаєте ви про налаштування JAXB для запобігання генеруванню автономного = "так" у отриманому XML?
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Чи знаєте ви про налаштування JAXB для запобігання генеруванню автономного = "так" у отриманому 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, тим самим уникаючи автономної властивості = "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)
Якщо я використовую властивість " Internal ", як і ви, я отримую 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\"?>");