Czy znasz ustawienie JAXB zapobiegające generowaniu standalone = "yes" w wynikowym pliku XML?
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Czy znasz ustawienie JAXB zapobiegające generowaniu standalone = "yes" w wynikowym pliku XML?
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Odpowiedzi:
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.
w JAXB, który jest częścią JDK1.6
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
standalone
atrybut w deklaracji XML.
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" .
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.
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\"?>");
To zadziałało dla mnie z JDK1.7. standalone = \ "nie \" można usunąć, aby uzyskać tylko resztę części xml
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();
Możesz użyć: marshaller.setProperty ("jaxb.fragment", Boolean.TRUE);
U mnie działa na Javie 8
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
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);
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\"?>");
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();
}
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\"?>");