web-dev-qa-db-fra.com

Supprimer 'standalone = "yes"' du XML généré

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"?>
75
Johan Pelgrim
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.

56
Sam

dans JAXB qui fait partie de JDK1.6

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
115
so_mv

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" .

55
WarFox

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

6
benez

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.

4
Kornel
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

3
Debasis Das

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();
2
eddo

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

0
Ari

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);  
0
Alisha Setia

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();
  }
0
Bernardo Mello