2012-12-20 11 views
11

मैं इसे संसाधित करने के लिए जेएक्सबी को कैसे निर्देश दे सकता हूं?जेएक्सबी के साथ दोहराए गए नेस्टेड कक्षाओं को कैसे उतारना है?

एक्सएमएल

<root> 
<parent> 
    <child id="1" name="foo" /> 
</parent> 
<parent> 
    <child id="3" name="foo2" /> 
</parent> 
<parent> 
    <child id="4" name="bar2" /> 
</parent> 
<parent> 
    <child id="2" name="bar" /> 
</parent> 
</root> 

Root.java

@XmlRootElement 
public class Root { 
    @XmlElement(name="parent/child") 
    List<Child> allChildren; 
} 

यह काम नहीं करता ... allChildren खाली है।

उत्तर

13

आप अपने मॉडल बदल सकते हैं और कर सकता है निम्नलिखित:

रूट

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Root { 
    @XmlElement(name="parent") 
    List<Parent> allParents; 
} 

जनक

@XmlAccessorType(XmlAccessType.FIELD) 
public class Parent { 
    @XmlElement(name="child") 
    List<Child> allChildren; 
} 

अद्यतन

यह माता पिता के वर्ग से बचने के लिए संभव है? - कोई JAXB कार्यान्वयन आप एक XmlAdapter इस्तेमाल कर सकते हैं करने के लिए लगभग Parent कक्षा में जोड़ने XmlAdapter

का उपयोग कर

विकल्प # 1:

अलग अलग तरीकों से यह पूरा करने के एक जोड़े हैं।

ChildAdapter

import javax.xml.bind.annotation.adapters.XmlAdapter; 

public class ChildAdapter extends XmlAdapter<ChildAdapter.Parent, Child> { 

    public static class Parent { 
     public Child child; 
    } 

    @Override 
    public Parent marshal(Child v) throws Exception { 
     Parent parent = new Parent(); 
     parent.child = v; 
     return parent; 
    } 

    @Override 
    public Child unmarshal(Parent v) throws Exception { 
     return v.child; 
    } 

} 

रूट

@XmlJavaTypeAdapter एनोटेशन संदर्भ के लिए XmlAdapter प्रयोग किया जाता है।

import java.util.List; 
import javax.xml.bind.annotation.*; 
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; 

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Root { 

    @XmlElement(name="parent") 
    @XmlJavaTypeAdapter(ChildAdapter.class) 
    List<Child> allChildren; 

} 

बाल

import javax.xml.bind.annotation.*; 

@XmlAccessorType(XmlAccessType.FIELD) 
public class Child { 

    @XmlAttribute 
    int id; 

    @XmlAttribute 
    String name; 

} 

विकल्प # 2 - आप अपने JAXB (JSR-222) कार्यान्वयन के रूप में EclipseLink JAXB (MOXy) का उपयोग कर रहे हैं तो आप कर सकता है निम्नलिखित (नोट EclipseLink JAXB (MOXY)

का उपयोग करना : मैं मोक्सी लीड हूं):

रूट

import java.util.List; 
import javax.xml.bind.annotation.*; 

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Root { 

    @XmlElement(name="parent") 
    List<Child> allChildren; 

} 

बाल

MOXY के @XmlPath एनोटेशन काफी जिस तरह से आप अपनी पोस्ट में @XmlElement एनोटेशन उपयोग करने के लिए कोशिश कर रहे हैं काम करता है।

import javax.xml.bind.annotation.*; 
import org.eclipse.persistence.oxm.annotations.XmlPath; 

@XmlAccessorType(XmlAccessType.FIELD) 
public class Child { 

    @XmlPath("child/@id") 
    int id; 

    @XmlPath("child/@name") 
    String name; 

} 

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

+0

क्या माता-पिता वर्ग से बचना संभव है? – Stephan

+4

+1 यह हमेशा आश्वस्त रहता है जब मैं स्वतंत्र रूप से क्षेत्र में एक स्वीकृत विशेषज्ञ के रूप में एक ही समाधान के साथ आ जाता हूं :-) –

+1

@ इयान रॉबर्ट्स - मैंने आपका उत्तर भी +1 किया :)। –

1

आप XmlElementWrapper एनोटेशन का उपयोग करने की कोशिश कर सकते हैं, लेकिन मुझे यकीन है कि यह कैसे कई आवरण नोड्स साथ काम करना चाहिए नहीं कर रहा हूँ:

@XmlRootElement 
public class Root { 
    @XmlElementWrapper(name="parent") 
    @XmlElement(name="child") 
    List<Child> allChildren; 
} 
+0

मैं पर इस का उपयोग करेगा केवल एक बच्चा पाएं, न कि सभी बच्चे। – Stephan

0

प्रयास करें इस

@XmlRootElement 
class Root { 
    List<Child> allChildren = new ArrayList<Child>(); 

    private static class Parent { 
     @XmlElement 
     Child child; 
    } 

    @XmlElement 
    public void setParent(Parent p) { 
     allChildren.add(p.child); 
    } 
} 
+0

हां उसने किया, लेकिन यहां पर माता-पिता सिर्फ एक चाल है, सिर्फ एक निजी वर्ग है। सबसे महत्वपूर्ण बात यह है कि हमारे पास सूची सूची नहीं है

2

आप एक वर्ग <parent> तत्व का प्रतिनिधित्व बनाने के लिए, इस तरह के

@XmlAccessorType(XmlAccessType.FIELD) 
public class Parent { 
    @XmlElement(name="child") 
    Child child; 
} 

के रूप में इसके बाद आप एक प्रकार एडाप्टर

public class ParentToChildAdapter extends XmlAdapter<Parent, Child> { 
    public Parent marshal(Child c) { 
    Parent p = new Parent(); 
    p.child = child; 
    return p; 
    } 

    public Child unmarshal(Parent p) { 
    return p.child; 
    } 
} 

बना सकते है और जड़ वर्ग

@XmlRootElement 
public class Root { 
    @XmlElement(name="parent") 
    @XmlJavaTypeAdapter(ParentToChildAdapter.class) 
    List<Child> allChildren; 
} 
संबंधित मुद्दे