Kennen Sie eine JAXB-Einstellung, um zu verhindern, dass im resultierenden XML Standalone = "yes" generiert wird?
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Kennen Sie eine JAXB-Einstellung, um zu verhindern, dass im resultierenden XML Standalone = "yes" generiert wird?
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Antworten:
Diese Liegenschaft:
marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", false);
... kann verwendet werden, um keine zu haben:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Ich würde diese bewährte Methode jedoch nicht in Betracht ziehen.
in JAXB ist das Teil von JDK1.6
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
standalone
Attribut in der XML-Deklaration entfernen .
Sie können entweder verwenden
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
oder
marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", false)
Um die Standard-XML-Deklaration zu deaktivieren und anschließend Ihre benutzerdefinierte XML-Deklaration hinzuzufügen,
<?xml version="1.0" encoding="UTF-8"?>
durch
marshaller.setProperty("com.sun.xml.bind.xmlHeaders",
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
auf die generierte XML, wodurch die eigenständige Eigenschaft "yes" vermieden wird .
Nur wenn noch jemand mit diesem Problem zu kämpfen hat, können Sie die Verwendung in Betracht ziehen
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
Um die gesamte XML-Deklaration zu entfernen, schreiben Sie einfach Ihre eigene String
am Anfang Ihres Ausgabestreams / Ihrer Ausgabemethode
Wenn Sie ein Dokument abhängig machen DOCTYPE
(z. B. benannte Entitäten verwenden), standalone="yes"
wird es nicht mehr eigenständig und ist daher in der XML-Deklaration nicht zulässig.
Standalone-XML kann jedoch überall verwendet werden, während Nicht-Standalone für XML-Parser, die keine externen Dateien laden, problematisch ist.
Ich sehe nicht ein, wie diese Deklaration ein Problem sein könnte, außer für die Interoperabilität mit Software, die XML nicht unterstützt, aber eine schreckliche Regex-Suppe.
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\"?>");
Dies funktionierte bei mir mit JDK1.7. standalone = "no" kann entfernt werden, um nur den Rest des XML-Teils zu erhalten
Wenn Sie nur das Standardpaket javax.xml verwenden, können Sie die Option JAXB_FRAGMENT des Marshallers auf 'true' setzen (dies lässt die Standardanweisung für die XML-Verarbeitung weg) und die Methode writeProcessingInstruction des XMLStreamWriter verwenden, um Ihre eigenen einzufügen:
xmlStreamWriter.writeProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\"");
jaxbMarshaller.setProperty( Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
jaxbMarshaller.marshal(object, xmlStreamWriter);
xmlStreamWriter.writeEndDocument();
Sie können verwenden: marshaller.setProperty ("jaxb.fragment", Boolean.TRUE);
Es funktioniert für mich unter Java 8
Ich habe keinen ausreichend hohen "Ruf", um das "Privileg" zu haben, Kommentare abzugeben. ;-);
@Debasis, beachten Sie, dass die von Ihnen angegebene Eigenschaft:
"com.sun.xml.internal.bind.xmlHeaders"
sollte sein:
"com.sun.xml.bind.xmlHeaders" (without the "internal", which are not meant to be used by the public)
Wenn ich die "interne" Eigenschaft wie Sie verwende, erhalte ich eine javax.xml.bind.PropertyException
Wenn Sie eine Eigenschaftsausnahme erhalten, fügen Sie die folgende Konfiguration hinzu:
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);
Ich verwende Java 1.8 und JAXB 2.3.1
Stellen Sie zunächst sicher, dass Sie Java 1.8 in pom.xml verwenden
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
Dann habe ich im Quellcode verwendet: (der Schlüssel war der interne Teil)
// remove standalone=yes
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
marshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders", "<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
Probier's einfach
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();
}
Wenn Sie haben <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
aber will das: <?xml version="1.0" encoding="UTF-8"?>
Mach einfach:
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
marshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders", "<?xml version=\"1.0\" encoding=\"UTF-8\"?>");