उत्पन्न XML से 'स्टैंडअलोन = "हां" निकालें


82

क्या आप परिणामी XML में स्वसंपूर्ण = "हां" को रोकने के लिए एक JAXB सेटिंग के बारे में जानते हैं ?

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

7
वह एक समस्या क्यों है?
कोर्नेल

@ मेरी परियोजना में है कि टिब्बो और वेबमथोड के साथ उपयोग करने के लिए, इसकी त्रुटि उत्पन्न होगी क्योंकि स्टैंडअलोन = हां मान्यता नहीं है
aswzen

जवाबों:


62

यह संपत्ति:

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

... का इस्तेमाल किया जा सकता है:

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

हालाँकि, मैं इस सर्वोत्तम अभ्यास पर विचार नहीं करूँगा।


2
धन्यवाद, यह वही है जो मुझे चाहिए था। मैं मानूंगा कि लाइन को शामिल करना सबसे अच्छा अभ्यास है, लेकिन मैं जिस वेब सेवा के साथ हस्तक्षेप कर रहा हूं वह इसकी उम्मीद नहीं करता है।
jgrowl

6
अच्छा है कि यह काम करता है, लेकिन एफडब्ल्यूआईडब्ल्यू, सेवा टूट गई है यदि यह कानूनी एक्सएमएल को स्वीकार नहीं कर सकता है, इसलिए इसके बारे में बग रिपोर्ट दर्ज करना अच्छा है।
स्टैक्मैन मैन 8'11

4
JDK1.6 में JAXB के साथ काम नहीं करता है। सही समाधान के लिए so_mv का उत्तर देखें।
शाम

1
उड़ान में विस्फोट: अपवाद।
निकोलस बारबुल्सको

1
@ सर्वे: आप प्रॉपर्टी क्लास आज़मा सकते हैं: "com.sun.xml.internal.bind.xmlHeaders"
baybora.oren

120

JAXB में JDK1.6 का हिस्सा है

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);

13
यह अपेक्षित परिणाम नहीं देता है। यह सभी XML घोषणा लाइन को हटा देता है। जो मैं चाहता हूं वह सिर्फ standaloneएक्सएमएल घोषणा में विशेषता को हटा रहा है ।
निकोलस बारबुल्स्को

यदि आप आश्चर्य करते हैं कि यह आपके लिए काम क्यों नहीं कर रहा है, जैसे मैंने किया, तो इसका उत्तर यह है कि इसका प्रभाव इस बात पर निर्भर करता है कि आप किस मार्शल एप का उपयोग कर रहे हैं। मार्शल (ऑब्जेक्ट, आउटपुटस्ट्रीम) और मार्शल (ऑब्जेक्ट, राइटर) के लिए यह यहाँ दिए गए सुझाव के अनुसार काम करता है। मार्शल (ऑब्जेक्ट, नोड) के लिए इसका कोई प्रभाव नहीं है। शेष मार्शल एप के निहितार्थ के लिए यहाँ एक नज़र है समर्थित गुण अनुभाग के तहत।
लास

60

आप या तो उपयोग कर सकते हैं

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);

या

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

डिफ़ॉल्ट XML घोषणा को अक्षम करने के लिए, और फिर अपने कस्टम XML घोषणा को जोड़ें,

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

द्वारा

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

उत्पन्न xml के लिए, इस प्रकार स्टैंडअलोन = "हाँ" संपत्ति से परहेज करना ।


2
"XmlDeclaration" के साथ "सेटप्रॉपर्टी" उड़ान में फट गया: अपवाद।
निकोलस बारबुल्सको

2
"XmlHeaders" के साथ "setProperty" लाइन भी विफल हो जाती है। PropertyException। तो यह कोई हल नहीं है।
निकोलस बारबुल्स्को

आप जावा और जक्सब के किस संस्करण का उपयोग कर रहे हैं?
वारफॉक्स

@ArFox xmlHeaders कमांड के साथ सेटप्रॉर्टी jdk1.6.0_24 और JAXB संस्करण 2.1 के साथ काम नहीं करता है
ब्रायन लार्सन

3
Java6 या java7 के बावजूद मुझे 'internal', यानी marshaller.setProperty ("com.sun.xml.internal.bind.xmlHeaders", "<? Xml" = "" एन्कोडिंग = \ "UTF-8 जोड़ना होगा? \ ">?");
काओल्टे

7

बस अगर कोई और इस समस्या से जूझ रहा है, तो आप उपयोग करने पर विचार कर सकते हैं

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

एक्सएमएल घोषणा के सभी को हटाने के लिए और बस Stringअपने आउटपुट स्ट्रीम / विधि की शुरुआत में अपना खुद का लिखें


5

यदि आप दस्तावेज़ को निर्भर करते हैं DOCTYPE(जैसे नामित संस्थाओं का उपयोग करें) तो यह स्टैंडअलोन होना बंद हो जाएगा, इस प्रकार standalone="yes"एक्सएमएल घोषणा में अनुमति नहीं दी जाएगी।

हालांकि स्टैंडअलोन XML का उपयोग कहीं भी किया जा सकता है, जबकि गैर-स्टैंडअलोन XML पार्सर के लिए समस्याग्रस्त है जो बाहरी लोड नहीं करते हैं।

मैं यह नहीं देखता कि यह घोषणा एक समस्या कैसे हो सकती है, सॉफ्टवेयर के साथ इंटरऑपरेबिलिटी के अलावा, जो एक्सएमएल का समर्थन नहीं करता है, लेकिन कुछ भयानक रीपेक्स सूप।


1
वास्तव में, किसी भी कथित रूप से एक्सएमएल-प्रसंस्करण प्रणाली जो एक्सएमएल घोषणा पर बारफ्स अत्यधिक संदिग्ध लगती है।
स्टेक्समैन

1
किस तरह से यह सवाल का जवाब देता है?
ᄂ ᄂ

दस्तावेज़ कैसे निर्भर करता है 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\"?>");

इसने मेरे लिए JDK1.7 के साथ काम किया। स्टैंडअलोन = \ "नहीं \" को केवल एक्सएमएल भाग के बाकी हिस्सों को प्राप्त करने के लिए हटाया जा सकता है


1
त्रुटि: javax.xml.bind.PropertyException: नाम: com.sun.xml.internal.bind.xmlHeaders मान: <? xml संस्करण = "1.0" एन्कोडिंग = "UTF-8"?>
aswzen

3

यदि आप केवल डिफ़ॉल्ट javax.xml पैकेज का उपयोग कर रहे हैं, तो आप मार्शलर के JAXB_FRAGMENT विकल्प को 'सही' पर सेट कर सकते हैं (यह डिफ़ॉल्ट xml प्रसंस्करण निर्देश को छोड़ देता है) और अपने स्वयं के सम्मिलित करने के लिए XMLStreamWriter के राइटप्रोसेसिंग .Inter विधि का उपयोग करें:

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


1

मेरे पास टिप्पणी करने के लिए "विशेषाधिकार" के लिए पर्याप्त उच्च "प्रतिष्ठा" नहीं है। ;-)

@Debasis, ध्यान दें कि आपके द्वारा निर्दिष्ट संपत्ति:

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

होना चाहिए:

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

यदि मैंने "आंतरिक" संपत्ति का उपयोग किया, जैसा कि मैंने किया था, तो मुझे एक javax.xml.bind.PropertyException मिली


1

यदि आपको संपत्ति अपवाद मिल रहा है, तो निम्नलिखित कॉन्फ़िगरेशन जोड़ें:

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

मैं जावा 1.8 और JAXB 2.3.1 का उपयोग कर रहा हूं

सबसे पहले, pom.xml में जावा 1.8 का उपयोग करना सुनिश्चित करें

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

तब स्रोत कोड में मैंने इस्तेमाल किया: (कुंजी आंतरिक भाग था)

// 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

कोशिश करो

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

यदि आपके पास है <?xml version="1.0" encoding="UTF-8" standalone="yes"?>

लेकिन यह चाहते हैं: <?xml version="1.0" encoding="UTF-8"?>

बस करो:

marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
marshaller.setProperty("com.sun.xml.internal.bind.xmlHeaders", "<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.