2011-02-01 13 views
12

बनाने इसलिए हम रूप में एक XSD प्रकार है:JAXB सूची टैग भीतरी वर्ग

<Foo> 
    <!-- Elements snipped for brevity--> 
    <Bars> 
     <Bar> 
      <!-- Bar Element --> 
     </Bar> 
    </Bars> 
</Foo> 

xjc लगभग सही परिणाम का उत्पादन:

<xs:complexType name="Foo"> 
    <xs:all> 
     <xs:element name="Bars"> 
      <xs:complexType> 
       <xs:sequence> 
        <xs:element name="Bar" type="barType" maxOccurs="unbounded"/> 
       </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
    </xs:all> 
</xs:complexType>  

एक्सएमएल प्रतिनिधित्व करने के लिए। केवल कष्टप्रद बात यह है कि "बार्स" को एक आंतरिक वर्ग के रूप में बनाया गया है जो बार्स की एक सूची संग्रहीत करता है। क्या अभी भी ऊपर एक्सएमएल बनाए रखने के दौरान बार्स में फू की सूची होने के बावजूद है?

उत्तर

2

एक और तरीका है अब और आसपास के < सलाखों > तत्व ड्रॉप करने, एक्सएमएल इतना अच्छा नहीं लगता होगा, लेकिन यह जावा कोड पढ़ने में आसान बनाने जाएगा। Xjc के सरल बाध्यकारी के साथ (http://jaxb.java.net/nonav/jaxb20-fcs/docs/vendorCustomizations.html देखें) यह काफी सुंदर और उपयोगी जावा कोड उत्पन्न करेगा।

1

आप कर सकता है निम्नलिखित:

package example; 

import java.util.List; 

import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlElementWrapper; 
import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement(name="Foo") 
public class Foo { 

    private List<Bar> bar; 

    public List<Bar> getBar() { 
     return bar; 
    } 

    @XmlElementWrapper(name="Bars") 
    @XmlElement(name="Bar") 
    public void setBar(List<Bar> bar) { 
     this.bar = bar; 
    } 

} 

और

package example; 

public class Bar { 

} 

तो आप निम्नलिखित कोड का उपयोग कर अपने एक्सएमएल पर कार्रवाई कर सकते हैं;

package example; 

import java.io.File; 

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

public class Demo { 

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

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     Foo foo = (Foo) unmarshaller.unmarshal(new File("src/forum128/input.xml")); 

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

दुर्भाग्यवश मैं xsd से जावा फ़ाइलों में जाने की कोशिश कर रहा हूं। – Jim

+0

मैं इस तरह कुछ [यहां मेरे प्रश्न] में देख रहा था (http://stackoverflow.com/questions/9240837/how-to-write-my-xsd-in-order-to-match-the-desired-xml -और-जावा प्रारूप का उपयोग-JAXB)। क्या XJC का उपयोग करके 'xmlElementWrapper' एनोटेशन उत्पन्न किया जा सकता है? मैं जेनरेट कोड को मैन्युअल रूप से संशोधित नहीं करना चाहूंगा ... –

+0

ब्लेज़: सबसे पहले, आपकी सभी पोस्ट्स के साथ-साथ आपका ब्लॉग (उदाहरण के लिए [यह पोस्ट] (http://blog.bdoughan.com/2010) /09/jaxb-collection-properties.html) जो इसे भी संदर्भित करता है)। हमेशा सुपर-स्पष्ट और बिंदु पर। मैं भी एक साधारण समाधान की तलाश में हूं (यानी एक xjc प्लगइन शामिल नहीं है) जो हमें xjc द्वारा '@ XmlElementWrapper' उत्पन्न करने देगा। यह .xsd में "शून्य" या "पास-थ्रू" होने के लिए तत्व घोषित करने में सक्षम होना बहुत साफ होगा, यानी इसके सभी उप-तत्व स्वचालित रूप से माता-पिता द्वारा निहित किए जाएंगे (या माता-पिता के पास भी अधिक होगा वह ध्वज)। –

2

शायद नमूना नीचे मदद करता है।

XML स्कीमा

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
    <xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

     <xs:complexType name="test"> 
     <xs:sequence> 
      <xs:element name="dataList" type="xs:string" nillable="true" minOccurs="0" maxOccurs="unbounded"/> 
      <xs:element name="str" type="xs:string" minOccurs="0"/> 
     </xs:sequence> 
     </xs:complexType> 
    </xs:schema> 

जावा वर्ग:

public class Test { 

    protected List<String> dataList; 
    protected String str; 
    public List<String> getDataList() { 
     if (dataList == null) { 
      dataList = new ArrayList<String>(); 
     } 
     return this.dataList; 
    } 

    public String getStr() { 
     return str; 
    } 

    public void setStr(String value) { 
     this.str = value; 
    } 

} 

संपादित करें 1:

आप XSD करने के लिए जावा कोड से रिवर्स इंजीनियर कर सकते हैं। JAVA_HOME/bin में स्कीमगेन निष्पादन योग्य है।

अपना जावा कोड दें और यह आपके जावा क्लास का उपयोग करके आपके लिए एक्सएसडी स्कीमा बनाएगा।

see this link

schemagen myObj1.java myObj2.java 
+0

यह XSD (मुझे लगता है कि) की तरह एक्सएमएल का वर्णन करता है जो काफी मैं क्या जरूरत नहीं है। – Jim

+0

@Jim ऊपर मेरा संपादन देखें। – fmucar

6

जब आप एक जटिल प्रकार के रूप में परिभाषित बार्स, बार अलग वर्ग के रूप में उत्पन्न हो जाएगा। इस तरह मुझे स्कीमा को पढ़ने में भी आसान लगता है। बार्स को फू में सूचीबद्ध नहीं किया जाएगा जबतक कि आप maxOccurs को 1 से अधिक मान में नहीं बदलते - आप इसे xs पर नहीं कर सकते: सब कुछ आप xs: अनुक्रम का उपयोग कर सकते हैं। maxOccurs = "असीम" seqence (बार्स की सूची प्राप्त करने:

... 
    <xs:complexType name="Foo"> 
     <xs:all> 
      <xs:element name="Bars" type="Bars" /> 
     </xs:all> 
    </xs:complexType> 

    <xs:complexType name="Bars"> 
     <xs:sequence> 
      <xs:element name="Bar" type="barType" maxOccurs="unbounded" /> 
     </xs:sequence> 
    </xs:complexType> 
... 

चल xjc के बाद: Foo.java:

... 
    @XmlAccessorType(XmlAccessType.FIELD) 
    @XmlType(name = "Foo", propOrder = { 

    }) 
    public class Foo { 

     @XmlElement(name = "Bars", required = true) 
     protected Bars bars; 

     public Bars getBars() { 
      return bars; 
     } 

     public void setBars(Bars value) { 
      this.bars = value; 
     } 
    } 

Bars.java:

... 
    @XmlAccessorType(XmlAccessType.FIELD) 
    @XmlType(name = "Bars", propOrder = { 
     "bar" 
    }) 
    public class Bars { 

     @XmlElement(name = "Bar", required = true) 
     protected List<String> bar; 

     ... 
    } 
XS के साथ

): एक्सएसडी:

... 
    <xs:complexType name="Foo"> 
     <xs:sequence> 
      <xs:element name="Bars" type="Bars" maxOccurs="unbounded" /> 
     </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="Bars"> 
     <xs:sequence> 
      <xs:element name="Bar" type="barType" maxOccurs="unbounded" /> 
     </xs:sequence> 
    </xs:complexType> 
    ... 

फू।जावा: xjc (https://github.com/dmak/jaxb-xew-plugin) के लिए

... 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "Foo", propOrder = { 
    "bars" 
}) 
public class Foo { 

    @XmlElement(name = "Bars", required = true) 
    protected List<Bars> bars; 

    public List<Bars> getBars() { 
     if (bars == null) { 
      bars = new ArrayList<Bars>(); 
     } 
     return this.bars; 
    } 
} 
4

Bjarne हैनसेन का प्लगइन आप "बार्स" तत्व enclosing, (नाम = "बार्स") सुविधाजनक @XmlElementWrapper पैदा टिप्पणी के साथ रहने के लिए अनुमति होगी।

+1

जैसा कि इस विषय पर कुछ अन्य पोस्ट/टिप्पणियों में बताया गया है, वह प्लगइन हाल ही के xjc के साथ काम नहीं कर रहा है। मैं इस पर दो दिनों से अपने सिर पर टक्कर लगी हूं। इसके अलावा मैं कमांड लाइन से xjc का उपयोग करना चाहता हूं, और इस प्लगइन को कम से कम एक चींटी लक्ष्य लिखने की आवश्यकता है, साथ ही साथ यह पता लगाएं कि जहां jaxb.jar हैक है, आदि –

+0

@PierreD: यदि प्लगइन कुछ संस्करण पर विफल रहता है आपको 'xjc' की आवश्यकता है, कृपया [प्लगइन बगट्रैकर] पर पोस्ट करें (https://github.com/dmak/jaxb-xew-plugin/issues)। –