¿Conoce una configuración JAXB para evitar que se genere standalone = "yes" en el XML resultante?
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
¿Conoce una configuración JAXB para evitar que se genere standalone = "yes" en el XML resultante?
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Respuestas:
Esta propiedad:
marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", false);
... se puede utilizar para no tener:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Sin embargo, no consideraría esta mejor práctica.
en JAXB que es parte de JDK1.6
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
standalone
atributo en la declaración XML.
Puedes usar
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
o
marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", false)
para deshabilitar la declaración XML predeterminada y luego agregar su declaración XML personalizada,
<?xml version="1.0" encoding="UTF-8"?>
por
marshaller.setProperty("com.sun.xml.bind.xmlHeaders",
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
al xml generado, evitando así la propiedad standalone = "yes" .
Si hace que el documento dependa de DOCTYPE
(por ejemplo, utiliza entidades con nombre), dejará de ser independiente, por standalone="yes"
lo que no se permitirá en la declaración XML.
Sin embargo, el XML independiente se puede usar en cualquier lugar, mientras que el no independiente es problemático para los analizadores XML que no cargan externos.
No veo cómo esta declaración podría ser un problema, aparte de la interoperabilidad con software que no es compatible con XML, pero con una horrible sopa de expresiones regulares.
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\"?>");
Esto funcionó para mí con JDK1.7. standalone = \ "no \" se puede eliminar para obtener solo el resto de la parte xml
Si está utilizando solo el paquete javax.xml predeterminado, puede establecer la opción JAXB_FRAGMENT del marshaller en 'true' (esto omite la instrucción de procesamiento xml predeterminada) y usar el método writeProcessingInstruction de XMLStreamWriter para insertar el suyo:
xmlStreamWriter.writeProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\"");
jaxbMarshaller.setProperty( Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
jaxbMarshaller.marshal(object, xmlStreamWriter);
xmlStreamWriter.writeEndDocument();
Puede utilizar: marshaller.setProperty ("jaxb.fragment", Boolean.TRUE);
Me funciona en Java 8
No tengo una "reputación" lo suficientemente alta como para tener el "privilegio" de comentar. ;-)
@Debasis, tenga en cuenta que la propiedad que ha especificado:
"com.sun.xml.internal.bind.xmlHeaders"
debiera ser:
"com.sun.xml.bind.xmlHeaders" (without the "internal", which are not meant to be used by the public)
Si uso la propiedad "interna" como lo hizo, obtengo una javax.xml.bind.PropertyException
En caso de que obtenga una excepción de propiedad, agregue la siguiente configuración:
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);
Estoy usando Java 1.8 y JAXB 2.3.1
Primero, asegúrese de usar java 1.8 en pom.xml
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
Luego, en el código fuente usé: (la clave era la parte interna)
// remove standalone=yes
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
marshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders", "<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
sólo inténtalo
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();
}
Si usted tiene <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
pero quiero esto: <?xml version="1.0" encoding="UTF-8"?>
Solo haz:
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
marshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders", "<?xml version=\"1.0\" encoding=\"UTF-8\"?>");