2011-05-25 11 views
9

पर ऑब्जेक्ट को क्रमबद्ध करते समय एक्सएमएल नेमस्पेस (xmlns) को कैसे जोड़ना है, मैं एक्सस्ट्रीम की मदद से एक्सएमएल को ऑब्जेक्ट्स को क्रमबद्ध कर रहा हूं। मैं एक्सस्ट्रीम को अपने ऑब्जेक्ट के एक्सएमएल आउटपुट में एक्सएमएलएन डालने के लिए कैसे कहूं?एक्सएमएल

@XStreamAlias(value="domain") 
public class Domain 
{ 
    @XStreamAsAttribute 
    private String type; 

    private String os; 

    (...) 
} 

मैं कैसे बिल्कुल Xstream साथ निम्नलिखित उत्पादन प्राप्त करते हैं:

एक उदाहरण के रूप में, मैं इस सरल वस्तु मैं क्रमानुसार करना चाहते हैं?

<domain type="kvm" xmlns:qemu="http://libvirt.org/schemas/domain/qemu/1.0"> 
    <os>linux</os> 
</domain> 

उत्तर

5

वैकल्पिक रूप से, यह उपयोग के मामले में JAXB कार्यान्वयन के साथ काफी आसानी से नियंत्रित किया जा सकता है (आप एक QNameMap में अपने नाम स्थान के विवरण की स्थापना की और पारित कि में StaxDriver करने की जरूरत है Metro, EclipseLink MOXy, Apache JaxMe, आदि):

डोमेन

package com.example; 

import javax.xml.bind.annotation.XmlAttribute; 
import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement 
public class Domain 
{ 
    private String type; 
    private String os; 

    @XmlAttribute 
    public String getType() { 
     return type; 
    } 

    public void setType(String type) { 
     this.type = type; 
    } 

    public String getOs() { 
     return os; 
    } 

    public void setOs(String os) { 
     this.os = os; 
    } 

} 

पैकेज-जानकारी

@XmlSchema(xmlns={ 
     @XmlNs(
      prefix="qemu", 
      namespaceURI="http://libvirt.org/schemas/domain/qemu/1.0") 
}) 
package com.example; 

import javax.xml.bind.annotation.XmlNs; 
import javax.xml.bind.annotation.XmlSchema; 

डेमो

package com.example; 

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBException; 
import javax.xml.bind.Marshaller; 

public class Demo { 

    public static void main(String[] args) throws JAXBException { 
     JAXBContext jc = JAXBContext.newInstance(Domain.class); 

     Domain domain = new Domain(); 
     domain.setType("kvm"); 
     domain.setOs("linux"); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(domain, System.out); 
    } 


} 

आउटपुट

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<domain xmlns:qemu="http://libvirt.org/schemas/domain/qemu/1.0" type="kvm"> 
    <os>linux</os> 
</domain> 

अधिक जानकारी के लिए

15

Xstream नामस्थान का समर्थन नहीं करता, लेकिन StaxDriver इसे इस्तेमाल करता है, करता है।

QNameMap qmap = new QNameMap(); 
qmap.setDefaultNamespace("http://libvirt.org/schemas/domain/qemu/1.0"); 
qmap.setDefaultPrefix("qemu"); 
StaxDriver staxDriver = new StaxDriver(qmap);  
XStream xstream = new XStream(staxDriver); 
xstream.autodetectAnnotations(true); 
xstream.alias("domain", Domain.class); 

Domain d = new Domain("kvm","linux"); 
String xml = xstream.toXML(d); 

आउटपुट::

<qemu:domain type="kvm" xmlns:qemu="http://libvirt.org/schemas/domain/qemu/1.0"> 
    <qemu:os>linux</qemu:os> 
</qemu:domain> 
+0

अच्छा, धन्यवाद! ठीक है लेकिन अभी भी एक समस्या है: मैं नहीं चाहता कि qemu उपसर्ग सभी नोड्स के लिए डिफ़ॉल्ट उपसर्ग के रूप में। इसे केवल रूट नोड के अंदर परिभाषित किया जाना चाहिए, जिससे परिणामी एक्सएमएल मेरे प्रश्न में बिल्कुल दिखता है। क्या आपके पास कोई संकेत है कि इसे कैसे प्राप्त किया जाए? – ifischer

+0

@ifischer मुझे नहीं लगता कि आपका सटीक आउटपुट प्राप्त करने का एक तरीका है। आप 'setDefaultPrefix' कथन को हटाने का प्रयास कर सकते हैं, लेकिन यह xmlns घोषणा से qemu को भी हटा देगा।यदि आप अपने तत्वों को उपसर्ग करने के लिए इसका उपयोग नहीं कर रहे हैं तो आपको अपने आउटपुट में क्यूमु की आवश्यकता क्यों है? – dogbane

+0

क्योंकि सभी बच्चे नोड्स क्यूमु-नेमस्पेस का उपयोग नहीं कर रहे हैं। इसके अलावा, शायद मैं बाद में अधिक एक्सएमएल नेमस्पेस जोड़ना चाहता हूं। बीटीडब्ल्यू, जेनरेट एक्सएमएल को एक बहुत ही विशिष्ट प्रारूप में होना चाहिए, क्योंकि इसे लिबर्ट में भेजा गया है, जो बहुत सख्त है। – ifischer

4

यह एक हैक का एक सा है, लेकिन यह त्वरित और आसान है: आपकी कक्षा xmlns कहा जाता है के लिए एक क्षेत्र को जोड़ने, और केवल यह है serialization के दौरान गैर-शून्य। अपने उदाहरण जारी रखने के लिए:

@XStreamAlias(value="domain") 
public class Domain 
{ 
    @XStreamAsAttribute 
    private String type; 

    private String os; 

    (...) 

    @XStreamAsAttribute 
    @XStreamAlias("xmlns:qemu") 
    String xmlns; 

    public void serialise(File path) { 
     XStream xstream = new XStream(new DomDriver()); 
     xstream.processAnnotations(Domain.class); 
     (...) 

     PrintWriter out = new PrintWriter(new FileWriter(path.toFile())); 
     xmlns = "http://libvirt.org/schemas/domain/qemu/1.0"; 
     xstream.toXML(this, out); 
     xmlns = null; 
    } 
} 

पूरा होने के लिए, xmlns = null की स्थापना एक finally खंड में होना चाहिए। PrintWriter का उपयोग करके आप आउटपुट की शुरुआत में एक्सएमएल घोषणा भी कर सकते हैं, अगर आपको पसंद है।