Connaissez-vous un paramètre JAXB pour empêcher standalone = "yes" d'être généré dans le XML résultant?
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
marshaller.setProperty("com.Sun.xml.bind.xmlDeclaration", Boolean.FALSE);
peut être utilisé pour ne pas
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Cependant, je ne considérerais pas cette meilleure pratique.
dans JAXB qui fait partie de JDK1.6
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
Vous pouvez soit utiliser
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
ou
marshaller.setProperty("com.Sun.xml.bind.xmlDeclaration", Boolean.FALSE)
désactiver la déclaration XML par défaut, puis ajouter votre déclaration XML personnalisée,
<?xml version="1.0" encoding="UTF-8"?>
par
marshaller.setProperty("com.Sun.xml.bind.xmlHeaders",
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
au xml généré, évitant ainsi la propriété standalone = "yes" .
juste si quelqu'un d'autre est toujours aux prises avec ce problème, vous pouvez envisager d'utiliser
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
pour supprimer toute la déclaration XML et écrire simplement votre propre String
au début de votre flux/méthode de sortie
Si vous rendez le document dépendant de DOCTYPE
(par exemple, utilisez des entités nommées), il cessera d'être autonome, donc standalone="yes"
ne sera pas autorisé dans la déclaration XML.
Cependant, le XML autonome peut être utilisé n'importe où, tandis que le non-autonome est problématique pour les analyseurs syntaxiques XML qui ne chargent pas d'externaux.
Je ne vois pas en quoi cette déclaration pourrait poser problème, si ce n’est pour l’interopérabilité avec des logiciels qui ne prennent pas en charge XML, mais une horrible soupe regex.
jaxbMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
jaxbMarshaller.setProperty("com.Sun.xml.internal.bind.xmlHeaders", "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>");
Cela a fonctionné pour moi avec JDK1.7. standalone =\"no \" peut être supprimé pour obtenir uniquement le reste de la partie xml
Si vous utilisez uniquement le package javax.xml par défaut, vous pouvez définir l'option JAXB_FRAGMENT du marshaller sur 'true' (ceci omet l'instruction de traitement XML par défaut) et utiliser la méthode writeProcessingInstruction de XMLStreamWriter pour insérer votre propre
xmlStreamWriter.writeProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\"");
jaxbMarshaller.setProperty( Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
jaxbMarshaller.marshal(object, xmlStreamWriter);
xmlStreamWriter.writeEndDocument();
Vous pouvez utiliser: marshaller.setProperty ("jaxb.fragment", Boolean.TRUE);
Cela fonctionne pour moi sur Java 8
Je n'ai pas assez de "réputation" pour avoir le "privilège" de commenter. ;-)
@Debasis, notez que la propriété que vous avez spécifiée:
"com.Sun.xml.internal.bind.xmlHeaders"
devrait être:
"com.Sun.xml.bind.xmlHeaders" (without the "internal", which are not meant to be used by the public)
Si j'utilise la propriété "internal" comme vous l'avez fait, j'obtiens un javax.xml.bind.PropertyException
Si vous obtenez une exception de propriété, ajoutez la configuration suivante:
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);
juste essayer
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();
}