it-swarm.dev

Odebrat 'standalone = "yes"' z generovaného XML

Víte o nastavení JAXB, aby se zabránilo standalone = "yes" z toho, že se vygeneruje ve výsledném XML?

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

lze použít k tomu, aby ne

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

Nicméně bych tuto nejlepší praxi nepovažoval.

56
Sam

v JAXB, který je součástí JDK1.6

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

Můžete použít

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

nebo

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

zakázat výchozí deklaraci XML a poté přidat vlastní deklaraci XML,

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

podle

marshaller.setProperty("com.Sun.xml.bind.xmlHeaders",
      "<?xml version=\"1.0\" encoding=\"UTF-8\"?>");

k vygenerovanému xml, čímž se vyhnete vlastnosti standalone = "yes" .

55
WarFox

pokud se s tímto problémem stále potýká někdo jiný, můžete zvážit jeho použití

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

chcete-li odstranit všechny deklarace XML a stačí napsat vlastní String na začátku výstupního toku/metody

6
benez

Pokud uděláte dokument závislý na DOCTYPE (např. Použití pojmenovaných entit), přestane být samostatný, takže standalone="yes" nebude povoleno v deklaraci XML.

Samostatné XML však lze použít kdekoli, zatímco ne-samostatné je problematické pro XML parsery, které nenahrávají externě. 

Nevidím, jak by toto prohlášení mohlo být problémem jiným než interoperabilitou se softwarem, který nepodporuje XML, ale nějakou hroznou regex polévkou.

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

To pro mě fungovalo s JDK1.7. standalone = "no" může být odstraněn, aby bylo možné získat pouze zbytek části XML

3
Debasis Das

Pokud používáte pouze výchozí balíček javax.xml, můžete nastavit volbu JAXB_FRAGMENT marshalleru na hodnotu „true“ (toto vynechá výchozí instrukce pro zpracování XML) a pomocí metody writeProcessingInstruction metody XMLStreamWriter vložte vlastní:

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

Můžete použít: Marshaller.setProperty ("jaxb.fragment", Boolean.TRUE);

Pracuje pro mě na Java 8

Nemám dostatek "pověsti", abych měl "privilegium" komentovat. ;-)

@Debasis, poznamenejte si, že vlastnost, kterou jste zadali:

"com.Sun.xml.internal.bind.xmlHeaders"

mělo by:

"com.Sun.xml.bind.xmlHeaders" (without the "internal", which are not meant to be used by the public)

Pokud používám "interní" vlastnost jako vy, dostanu javax.xml.bind.PropertyException

0
Ari

Pokud získáváte výjimku, přidejte následující konfiguraci: 

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