Usuń „standalone =„ yes ”” z wygenerowanego XML


82

Czy znasz ustawienie JAXB zapobiegające generowaniu standalone = "yes" w wynikowym pliku XML?

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

7
Dlaczego to jest problemem?
Kornel

@Kornel w moim projekcie, który ma być używany z Tibco i WebMethod, wygeneruje błąd, ponieważ standalone = yes nie jest rozpoznawany
aswzen

Odpowiedzi:


62

Ta nieruchomość:

marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", false);

... można użyć, aby nie mieć:

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

Jednak nie rozważałbym tej najlepszej praktyki.


2
Dzięki, właśnie tego potrzebowałem. Zgadzam się, że dołączanie linii jest najlepszą praktyką, ale usługa sieciowa, z którą się łączę, nie oczekuje tego.
jgrowl

6
Dobrze, że to działa, ale FWIW, usługa jest zepsuta, jeśli nie może akceptować legalnego pliku XML, więc prawdopodobnie dobrze jest zgłosić błąd.
StaxMan

4
Nie działa z JAXB w JDK1.6. Zobacz odpowiedź so_mv, aby uzyskać prawidłowe rozwiązanie.
sversch

1
To eksploduje w locie: wyjątek.
Nicolas Barbulesco

1
@sversch: możesz wypróbować klasę właściwości: "com.sun.xml.internal.bind.xmlHeaders"
baybora.oren

120

w JAXB, który jest częścią JDK1.6

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);

13
Nie daje to oczekiwanego rezultatu. Spowoduje to usunięcie całej linii deklaracji XML. Chcę tylko usunąć standaloneatrybut w deklaracji XML.
Nicolas Barbulesco

Jeśli zastanawiasz się, dlaczego to nie działa dla Ciebie, tak jak ja, to odpowiedź jest taka, że ​​efekt zależy od tego, którego api Marshal używasz. W przypadku Marshal (Object, Outputstream) i Marshal (Object, Writer) działa to zgodnie z sugestią tutaj. W przypadku marszałka (Object, Node) nie ma to żadnego efektu. Dla pozostałych marszałkowskich implikacji api rzucić okiem tutaj sekcji Obsługiwane Właściwości.
Lasse Samson

60

Możesz użyć

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);

lub

marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", false)

aby wyłączyć domyślną deklarację XML, a następnie dodać własną deklarację XML,

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

przez

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

do wygenerowanego pliku XML, unikając w ten sposób właściwości standalone = "yes" .


2
„SetProperty” z „xmlDeclaration” eksploduje w locie: wyjątek.
Nicolas Barbulesco

2
Linia „setProperty” z „xmlHeaders” również nie działa. PropertyException. Więc to nie jest rozwiązanie.
Nicolas Barbulesco

której wersji java i jaxb używasz?
WarFox

@WarFox Polecenie setProperty z xmlHeaders nie działa z jdk1.6.0_24 i JAXB w wersji 2.1
Bryan Larson

3
Niezależnie od java6 czy java7 musiałem dodać 'wewnętrzny', tj. Marshaller.setProperty ("com.sun.xml.internal.bind.xmlHeaders", "<? Xml version = \" 1.0 \ "encoding = \" UTF-8 \ "?>");
Caoilte

7

jeśli ktoś jeszcze boryka się z tym problemem, możesz rozważyć użycie

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

aby usunąć całą deklarację XML i po prostu napisz własną Stringna początku strumienia / metody wyjściowej


5

Jeśli uzależnisz dokument od DOCTYPE(np. Użyjesz nazwanych encji), to przestanie on być samodzielny, przez standalone="yes"co nie będzie dozwolony w deklaracji XML.

Jednak samodzielny plik XML może być używany w dowolnym miejscu, podczas gdy nieautonomiczny jest problematyczny dla parserów XML, które nie ładują zewnętrznych.

Nie rozumiem, w jaki sposób ta deklaracja mogłaby stanowić problem, poza współpracą z oprogramowaniem, które nie obsługuje XML, ale jakąś okropną zupą regex.


1
Dokładnie, każdy rzekomy system przetwarzania XML, który barfs na deklaracji XML wydaje się wysoce podejrzany.
StaxMan

1
W jaki sposób odpowiada na to pytanie?
ᄂ ᄀ

Od czego zależy dokument DOCTYPE?
Lii

3
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 zadziałało dla mnie z JDK1.7. standalone = \ "nie \" można usunąć, aby uzyskać tylko resztę części xml


1
błąd: javax.xml.bind.PropertyException: name: com.sun.xml.internal.bind.xmlHeaders wartość: <? xml version = "1.0" encoding = "UTF-8"?>
aswzen

3

Jeśli używasz tylko domyślnego pakietu javax.xml, możesz ustawić opcję JAXB_FRAGMENT marshallera na `` true '' (pomija to domyślną instrukcję przetwarzania XML) i użyć metody writeProcessingInstruction z XMLStreamWriter, aby wstawić własną:

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


1

Nie mam wystarczająco dużej „reputacji”, aby mieć „przywilej” komentowania. ;-)

@Debasis, zwróć uwagę, że określona właściwość:

"com.sun.xml.internal.bind.xmlHeaders"

Powinien być:

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

Jeśli użyję właściwości „internal” tak jak Ty, otrzymam wyjątek javax.xml.bind.PropertyException


1

W przypadku, gdy otrzymujesz wyjątek dotyczący właściwości, dodaj następującą konfigurację:

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);  

1

Używam Javy 1.8 i JAXB 2.3.1

Po pierwsze, upewnij się, że używasz języka Java 1.8 w pom.xml

<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>

Następnie w kodzie źródłowym użyłem: (klucz był częścią wewnętrzną)

// remove standalone=yes
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
marshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders", "<?xml version=\"1.0\" encoding=\"UTF-8\"?>");

0

Spróbuj

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

Jeśli masz <?xml version="1.0" encoding="UTF-8" standalone="yes"?>

ale chcę tego: <?xml version="1.0" encoding="UTF-8"?>

Po prostu zrób:

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
marshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders", "<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.