Do you know of a JAXB setting to prevent standalone="yes" from being generated in the resulting XML?
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Do you know of a JAXB setting to prevent standalone="yes" from being generated in the resulting XML?
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
This property:
marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", false);
...can be used to have no:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
However, I wouldn't consider this best practice.
in JAXB that is part of JDK1.6
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
standalone
attribute in the XML declaration. –
U This property:
marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", false);
...can be used to have no:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
However, I wouldn't consider this best practice.
You can either use
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
or
marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", false)
to disable the default XML declaration, and then add your custom XML declaration,
<?xml version="1.0" encoding="UTF-8"?>
by
marshaller.setProperty("com.sun.xml.bind.xmlHeaders",
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
to the generated xml, thus avoiding the standalone="yes" property.
just if someone else is still struggeling with this problem, you may consider using
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
to remove all of the XML declaration and just write your own String
at the beginning of your output stream / method
If you make document dependent on DOCTYPE
(e.g. use named entities) then it will stop being standalone, thus standalone="yes"
won't be allowed in XML declaration.
However standalone XML can be used anywhere, while non-standalone is problematic for XML parsers that don't load externals.
I don't see how this declaration could be a problem, other than for interoperability with software that doesn't support XML, but some horrible regex soup.
DOCTYPE
? –
Maple jaxbMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
jaxbMarshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders", "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>");
This worked for me with JDK1.7. standalone=\"no\" can be removed to get only rest of the xml part
If you are using only the default javax.xml package, you could set the JAXB_FRAGMENT option of the marshaller to 'true' (this omits the default xml processing instruction) and use the writeProcessingInstruction method of the XMLStreamWriter to insert your own:
xmlStreamWriter.writeProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\"");
jaxbMarshaller.setProperty( Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
jaxbMarshaller.marshal(object, xmlStreamWriter);
xmlStreamWriter.writeEndDocument();
just try
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();
}
I'm using Java 1.8 and JAXB 2.3.1
First, be sure to be using java 1.8 in pom.xml
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
Then in source code I used: (the key was the internal part)
// remove standalone=yes
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
marshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders", "<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
You can use: marshaller.setProperty("jaxb.fragment", Boolean.TRUE);
It works for me on Java 8
I don't have a high enough "reputation" to have the "privilege" to comment. ;-)
@Debasis, note that the property you've specified:
"com.sun.xml.internal.bind.xmlHeaders"
should be:
"com.sun.xml.bind.xmlHeaders" (without the "internal", which are not meant to be used by the public)
If I use the "internal" property as you did, I get a javax.xml.bind.PropertyException
In case you are getting property exception, add the following configuration:
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);
If you have <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
but want this: <?xml version="1.0" encoding="UTF-8"?>
Just do:
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
marshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders", "<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
I was getting PropertyException when using:
marshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders", "<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
Instead what helped me was setting JAXB_FRAGMENT to true and then writing the custom header using:
marshaller.setProperty("org.glassfish.jaxb.xmlHeaders", "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE note SYSTEM>"
Here's an updated answer for Java 17 / Java 21 (using the Eclipse Jakarta reference implementation of JAXB).
My dependencies in POM look like this (for a Java SE application):
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-bom</artifactId>
<version>4.0.5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- JAXB API -->
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
</dependency>
<!-- JAXB Implementation (needed when not executing in a Java EE server) -->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
The relevant property is nowadays named org.glassfish.jaxb.xmlHeaders
as per the documentation found HERE.
So, you would do:
String customXmlHeader = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
marshaller.setProperty("org.glassfish.jaxb.xmlHeaders", customXmlHeader);
© 2022 - 2024 — McMap. All rights reserved.