Sonuçta elde edilen XML'de bağımsız = "evet" oluşturulmasını önlemek için bir JAXB ayarı biliyor musunuz ?
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Sonuçta elde edilen XML'de bağımsız = "evet" oluşturulmasını önlemek için bir JAXB ayarı biliyor musunuz ?
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Yanıtlar:
Bu mülk:
marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", false);
... sahip olmamak için kullanılabilir:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Ancak, bu en iyi uygulamayı düşünmüyorum.
JDK1.6'nın parçası olan JAXB'de
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
standalone
XML bildirimindeki özniteliği kaldırmak .
Ya kullanabilirsiniz
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
veya
marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", false)
varsayılan XML bildirimini devre dışı bırakmak ve ardından özel XML bildiriminizi eklemek için,
<?xml version="1.0" encoding="UTF-8"?>
tarafından
marshaller.setProperty("com.sun.xml.bind.xmlHeaders",
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
oluşturulan xml'ye, böylece standalone = "yes" özelliğinden kaçınılır .
Belgeyi bağımlı hale getirirseniz DOCTYPE
(örneğin, adlandırılmış varlıkları kullanırsanız), o zaman bağımsız olmayı standalone="yes"
bırakacaktır , dolayısıyla XML bildiriminde izin verilmeyecektir.
Bununla birlikte, bağımsız XML her yerde kullanılabilirken, bağımsız olmayan XML, harici öğeleri yüklemeyen XML ayrıştırıcıları için sorunludur.
XML'i desteklemeyen, ancak korkunç bir normal ifade çorbası olan bir yazılımla birlikte çalışabilirlik dışında bu bildirimin nasıl bir sorun olabileceğini anlamıyorum.
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\"?>");
Bu, JDK1.7 ile benim için çalıştı. standalone = \ "hayır \" yalnızca xml bölümünün geri kalanını almak için kaldırılabilir
Yalnızca varsayılan javax.xml paketini kullanıyorsanız, sıralayıcının JAXB_FRAGMENT seçeneğini 'true' olarak ayarlayabilirsiniz (bu, varsayılan xml işleme talimatını atlar) ve kendi yazınızı eklemek için XMLStreamWriter'ın writeProcessingInstruction yöntemini kullanabilirsiniz:
xmlStreamWriter.writeProcessingInstruction("xml", "version=\"1.0\" encoding=\"UTF-8\"");
jaxbMarshaller.setProperty( Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
jaxbMarshaller.marshal(object, xmlStreamWriter);
xmlStreamWriter.writeEndDocument();
Şunları kullanabilirsiniz: marshaller.setProperty ("jaxb.fragment", Boolean.TRUE);
Java 8'de benim için çalışıyor
Yorum yapma "ayrıcalığına" sahip olacak kadar yüksek bir "itibarım" yok. ;-)
@Debasis, belirttiğiniz mülkün:
"com.sun.xml.internal.bind.xmlHeaders"
olmalı:
"com.sun.xml.bind.xmlHeaders" (without the "internal", which are not meant to be used by the public)
Sizin yaptığınız gibi "dahili" özelliği kullanırsam, bir javax.xml.bind.PropertyException alırım
Mülk istisnası almanız durumunda, aşağıdaki yapılandırmayı ekleyin:
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);
Java 1.8 ve JAXB 2.3.1 kullanıyorum
Öncelikle, pom.xml'de java 1.8 kullandığınızdan emin olun.
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
Sonra kaynak kodda kullandım: (anahtar iç kısımdı)
// remove standalone=yes
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
marshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders", "<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
sadece dene
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();
}
Eğer varsa <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
ama bunu istiyorum: <?xml version="1.0" encoding="UTF-8"?>
Sadece yap:
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
marshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders", "<?xml version=\"1.0\" encoding=\"UTF-8\"?>");