Czy znasz ustawienie JAXB zapobiegające generowaniu standalone = "yes" w wynikowym pliku XML?
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
xml
xsd
jaxb
xml-binding
Johan Pelgrim
źródło
źródło
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.
źródło
w JAXB, który jest częścią JDK1.6
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
źródło
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" .
źródło
jeśli ktoś jeszcze boryka się z tym problemem, możesz rozważyć użycie
aby usunąć całą deklarację XML i po prostu napisz własną
String
na początku strumienia / metody wyjściowejźródło
Jeśli uzależnisz dokument od
DOCTYPE
(np. Użyjesz nazwanych encji), to przestanie on być samodzielny, przezstandalone="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.
źródło
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
źródło
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ą:
źródło
Możesz użyć: marshaller.setProperty ("jaxb.fragment", Boolean.TRUE);
U mnie działa na Javie 8
źródło
Nie mam wystarczająco dużej „reputacji”, aby mieć „przywilej” komentowania. ;-)
@Debasis, zwróć uwagę, że określona właściwość:
Powinien być:
Jeśli użyję właściwości „internal” tak jak Ty, otrzymam wyjątek javax.xml.bind.PropertyException
źródło
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);
źródło
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\"?>");
źródło
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(); }
źródło
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\"?>");
źródło