Oluşturulan XML'den 'standalone = "yes" i kaldırın


82

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"?>

7
Bu neden bir problem?
Kornel

@Kornel, Tibco ve WebMethod ile kullanılacak projemde hata oluşturacak çünkü bağımsız = evet tanınmıyor
aswzen

Yanıtlar:


62

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.


2
Teşekkürler, tam da ihtiyacım olan şey bu. Hattın dahil edilmesinin en iyi uygulama olduğuna katılıyorum, ancak arayüz oluşturduğum bir web hizmeti bunu beklemiyor.
jgrowl

6
Çalışması iyi, ancak FWIW, yasal xml'yi kabul edemezse hizmet bozulur, bu nedenle buna karşı bir hata raporu göndermek muhtemelen iyidir.
StaxMan

4
JDK1.6'da JAXB ile çalışmaz. Doğru çözüm için so_mv'nin cevabına bakın.
sversch

1
Bu uçuş sırasında patlar: istisna.
Nicolas Barbulesco

1
@sversch: özellik sınıfını deneyebilirsiniz: "com.sun.xml.internal.bind.xmlHeaders"
baybora.oren

120

JDK1.6'nın parçası olan JAXB'de

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);

13
Bu beklenen sonucu vermiyor. Bu, tüm XML bildirim satırını kaldırır. İstediğim şey sadece standaloneXML bildirimindeki özniteliği kaldırmak .
Nicolas Barbulesco

Bunun sizin için neden işe yaramadığını merak ediyorsanız, tıpkı benim yaptığım gibi, yanıt, etkinin hangi mareşal api'yi kullandığınıza bağlı olmasıdır. Mareşal (Object, Outputstream) ve mareşal (Object, Writer) için bu, burada önerildiği gibi çalışır. Mareşal için (Nesne, Düğüm) hiçbir etkisi yoktur. Kalan mareşal api çıkarımları için Desteklenen Özellikler bölümü altında buraya bir göz atın .
Lasse Samson

60

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 .


2
"XmlDeclaration" ile "setProperty", flight: exception sırasında patlar.
Nicolas Barbulesco

2
"XmlHeaders" içeren "setProperty" satırı da başarısız oluyor. PropertyException. Yani bu bir çözüm değil.
Nicolas Barbulesco

java ve jaxb'nin hangi sürümünü kullanıyorsunuz?
WarFox

@WarFox xmlHeaders ile setProperty komutu jdk1.6.0_24 ve JAXB sürüm 2.1 ile çalışmıyor
Bryan Larson

3
Java6 veya java7'den bağımsız olarak, 'internal', yani marshaller.setProperty ("com.sun.xml.internal.bind.xmlHeaders", "<? Xml version = \" 1.0 \ "encoding = \" UTF-8 eklemem gerekiyordu \ "?>");
Caoilte

7

Sadece bir başkası hala bu sorunla uğraşıyorsa, kullanmayı düşünebilirsiniz

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

tüm XML bildirimini kaldırmak ve Stringçıktı akışınızın / yönteminizin başında kendinizinkini yazmak için


5

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.


1
Tam olarak, xml bildirimini engelleyen herhangi bir xml işleme sistemi olduğu iddia edilen herhangi bir sistem oldukça şüpheli görünüyor.
StaxMan

1
Soruya ne şekilde cevap veriyor?
ᄂ ᄀ

Belge nasıl bağımlı hale getirilir 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\"?>");

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


1
error: javax.xml.bind.PropertyException: name: com.sun.xml.internal.bind.xmlHeaders değeri: <? xml version = "1.0" encoding = "UTF-8"?>
aswzen

3

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

2

Şunları kullanabilirsiniz: marshaller.setProperty ("jaxb.fragment", Boolean.TRUE);

Java 8'de benim için çalışıyor


1

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


1

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

1

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

0

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

0

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\"?>");
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.