webentwicklung-frage-antwort-db.com.de

Entfernen Sie "standalone =" yes "" aus generiertem XML

Kennen Sie eine JAXB-Einstellung, um zu verhindern, dass standalone = "yes" im resultierenden XML generiert wird?

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
75
Johan Pelgrim
marshaller.setProperty("com.Sun.xml.bind.xmlDeclaration", Boolean.FALSE);

kann verwendet werden, um keine zu haben

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

Allerdings würde ich diese bewährte Methode nicht in Betracht ziehen.

56
Sam

in JAXB, das Teil von JDK1.6 ist

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

Sie können entweder verwenden

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

oder

marshaller.setProperty("com.Sun.xml.bind.xmlDeclaration", Boolean.FALSE)

deaktivieren Sie die Standard-XML-Deklaration und fügen Sie anschließend Ihre benutzerdefinierte XML-Deklaration hinzu

<?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-Datei, wodurch die Eigenschaft standalone = "yes" .

55
WarFox

nur wenn noch jemand mit diesem Problem zu kämpfen hat, können Sie dies 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 Ausgabestroms/der Ausgabemethode

6
benez

Wenn Sie das Dokument von DOCTYPE abhängig machen (z. B. benannte Entitäten verwenden), ist es nicht mehr eigenständig. Daher ist standalone="yes" in der XML-Deklaration nicht zulässig.

Standalone-XML kann jedoch überall verwendet werden, während das Nicht-Standalone-Verfahren für XML-Parser, die keine externen Daten laden, problematisch ist. 

Ich verstehe nicht, wie diese Deklaration ein Problem darstellen könnte, außer für die Interoperabilität mit Software, die XML nicht unterstützt, sondern eine schreckliche Regex-Suppe.

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\"?>");

Das funktionierte für mich mit JDK1.7. standalone =\"no \" kann entfernt werden, um nur den Rest des XML-Teils zu erhalten

3
Debasis Das

Wenn Sie nur das Standardpaket javax.xml verwenden, können Sie die Option JAXB_FRAGMENT des Marshalls auf 'true' setzen (dadurch wird die standardmäßige XML-Verarbeitungsanweisung ausgelassen) und die writeProcessingInstruction-Methode des XMLStreamWriter zum Einfügen Ihrer eigenen verwendet:

xmlStreamWriter.writeProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\"");
jaxbMarshaller.setProperty( Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
jaxbMarshaller.marshal(object, xmlStreamWriter);
xmlStreamWriter.writeEndDocument();
2
eddo

Sie können verwenden: marshaller.setProperty ("jaxb.fragment", Boolean.TRUE);

Es funktioniert für mich auf Java 8

Ich habe kein hohes Ansehen, um das Privileg zu kommentieren. ;-)

@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 benutze, erhalte ich eine javax.xml.bind.PropertyException

0
Ari

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

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