2011-03-25 22 views
55

मैं जावा क्लास में गुणों के क्रम को सम्मानित करने के लिए अपने जावा क्लास से क्रमबद्ध एक्सएमएल आउटपुट चाहता हूं।जेएक्सबी और संपत्ति आदेश

ऐसा लगता है कि जेएक्सबी वर्णानुक्रम के अनुसार आदेश देता है।

मैं propOrder साथ @XmlType का उपयोग करने और संपत्तियों की सभी निर्दिष्ट करके इस ओवरराइड कर सकते हैं, लेकिन मैं कई गुणों के साथ एक वर्ग है और इन अभी तक अंतिम रूप नहीं कर रहे हैं।

मैंने पढ़ा है कि एक खाली propOrder निर्दिष्ट करना है लेकिन ऐसा नहीं है।

मेरे उदाहरण वर्ग:

package test; 

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

@XmlRootElement 
//@XmlType(propOrder={"company", "scheme", "agreementNumber"}) 
@XmlType(propOrder={}) // makes no difference - still alphabetical in XML 
public class CustomerPlan2 { 

    private String company; 
    private String scheme; 
    private String agreementNumber; 

    @XmlElement(name="Company") 
    public String getCompany() { 
     return company; 
    } 
    public void setCompany(String company) { 
     this.company = company; 
    } 

    @XmlElement(name="Scheme") 
    public String getScheme() { 
     return scheme; 
    } 
    public void setScheme(String scheme) { 
     this.scheme = scheme; 
    } 

    @XmlElement(name="AgreementNumber") 
    public String getAgreementNumber() { 
     return agreementNumber; 
    } 
    public void setAgreementNumber(String agreementNumber) { 
     this.agreementNumber = agreementNumber; 
    } 
} 

मेरे serialize कोड:

CustomerPlan2 cp2 = new CustomerPlan2(); 

    cp2.setCompany("company"); 
    cp2.setScheme("scheme"); 
    cp2.setAgreementNumber("agreementnumber"); 
    JAXBContext context = JAXBContext.newInstance(CustomerPlan2.class); 
    Marshaller marshaller = context.createMarshaller(); 

    marshaller.marshal(cp2, new FileWriter("C:\\temp\\out.xml")); 

आउटपुट:

<customerPlan2> 
     <AgreementNumber>agreementnumber</AgreementNumber> 
     <Company>company</Company> 
     <Scheme>scheme</Scheme> 
    </customerPlan2> 

मैं अपने उत्पादन होना चाहता हूँ (मेरी कक्षा की संपत्ति आदेश के रूप में) :

<customerPlan2> 
     <Company>company</Company> 
     <Scheme>scheme</Scheme> 
     <AgreementNumber>agreementnumber</AgreementNumber> 
    </customerPlan2> 

इस पर किसी भी मदद के लिए धन्यवाद।

उत्तर

22

नोट: मैं नेतृत्व EclipseLink JAXB (MOXy)

जिस क्रम में जावा प्रतिबिंब फ़ील्ड की सूची देता है/गुण इसकी गारंटी नहीं है। यही कारण है कि जेएक्सबी कार्यान्वयन तत्व आदेश निर्धारित करने के लिए इसका उपयोग नहीं करते हैं।

डिफ़ॉल्ट रूप से जेएक्सबी no guaranteed ordering प्रदान करता है। हालांकि अधिकांश (यदि सभी जेएक्सबी कार्यान्वयन नहीं हैं) यह वर्णनात्मक क्रम का उपयोग करते हैं क्योंकि यह निर्धारक है। आदेश देने से आप अपने वर्ग के रूप में इस पर टिप्पणी करना चाहिए इस बात की गारंटी करने के लिए:

@XmlAccessorOrder(XmlAccessOrder.ALPHABETICAL) 
public class Foo { 
    ... 
} 
+1

क्या यह आपके सुपरक्लास से विरासत में संपत्तियों के साथ भी काम करना चाहिए? –

+0

मैंने ऐसा किया और एक पर्यावरण में marshalling चलाने और एक और पर्यावरण में marshalling चलाने के दौरान सामान्य अल्फा आदेश चलाने के दौरान रिवर्स अल्फा आदेश मिला। कोई विचार/सुझाव? – Achilles929

1
this के अनुसार

, XML तत्वों भाई की क्रम इसकी गारंटी नहीं है।

59

यह का उपयोग कर सकता है:

@XmlType (propOrder={"prop1","prop2",..."propN"}) 

बस इस तरह कोड uncomment:

//@XmlType(propOrder={"company", "scheme", "agreementNumber"}) 

यह सही उपयोग है।

+0

यह सच है: http://jaxb.java.net/tutorial/section_6_2_2-Annotation-for-Classes-XmlType.html#Annotation%20for%20Classes:%20XmlType XmlType एनोटेशन में –

3

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

@XmlRootElement(name = "Product") 
@XmlType(name="",propOrder={"productName","productVersion",..."propN"}) 

का हिस्सा बनने के लिए आवश्यक थे ... वैसे मैं क्यों यह काम करता है के लिए पर्याप्त नहीं! :)

+1

नाम विशेषता की जरूरत नहीं है, बस propOrder विशेषता पर्याप्त है, यानी @XmlType (propOrder = {"productName", "productVersion", ... "propN"}) – Michael

4
@XmlType(propOrder={"company", "scheme", "agreementNumber"}) 

यह सही है, लेकिन क्या आपने यह कोशिश की है?

@XmlType(propOrder={"Company", "Scheme", "AgreementNumber"}) 
0

@XmlType(propOrder={"prop1", "prop2"}) में आप घोषणा कर सकते हैं केवल propertyName आप कक्षा में घोषित कर दिया। आप XmlTypepropOrder जैसा कि ऊपर उल्लेख में

XMLElement name (
@XmlElement(name="Company")) 

घोषणा कर सकते हैं नहीं ..

1

बस जोड़ें:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(propOrder={"field1", "field2", ...}) 
0

आप वर्ग के लिए propOrder और XmlAccessType टिप्पणियां जोड़ने के लिए है।

@XmlAccessorType(XmlAccessType.FIELD) 

@XmlType(propOrder = {"PartyType","PartyName","PartyAddress"}) 
+0

डाउनवोट: डुप्लिकेट – Murmel

संबंधित मुद्दे