2011-08-24 12 views
10

मैं अपने XML स्कीमा में एक तत्व है कि परिभाषित किया गया है इस प्रकार है एक पैटर्न के साथ एक पूर्णांक की आवश्यकता के लिए वर्ग उत्पन्नका उपयोग JAXB एक तत्व है कि

<xs:simpleType name="NumberCodeValueType"> 
    <xs:restriction base="xs:int"> 
     <xs:pattern value="[0-7]{7}"/> 
    </xs:restriction> 
</xs:simpleType> 

कि है, मेरा नंबर अग्रणी 0s से शुरू हो सकता है। मैं इस स्कीमा को संशोधित नहीं कर सकता। मैं अपने जावा कक्षाएं उत्पन्न करने के लिए जेएक्सबी का उपयोग कर रहा हूं। दुर्भाग्यवश, Code तत्व के लिए एक्सेसर पूर्णांक की एक सूची को तर्क के रूप में लेता है जिसका अर्थ है कि सभी प्रमुख 0s को हटा दिया गया है (क्योंकि, जो मैं कह सकता हूं उससे, जावा में अग्रणी 0s को पूर्णांक प्रकार का उपयोग करते समय रखने का कोई तरीका नहीं है)!

क्या कोई तरीका है जिससे मैं इसे ठीक कर सकता हूं?

आपकी मदद के लिए धन्यवाद!

उत्तर

31

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

NumberFormatter

आप अपनी खुद की फ़ॉर्मेटर लिख कर ऐसा कर सकते हैं:

package forum7182533; 

public class NumberFormatter { 

    public static String printInt(Integer value) { 
     String result = String.valueOf(value); 
     for(int x=0, length = 7 - result.length(); x<length; x++) { 
      result = "0" + result; 
     } 
     return result; 
    } 

    public static Integer parseInt(String value) { 
     return Integer.valueOf(value); 
    } 

} 

XMLSchema (format.xsd)

फिर जब आप अपने एक्सएमएल से अपनी कक्षाएं उत्पन्न करने जा रहे हैं स्कीमा:

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

    <xs:element name="root"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="number" type="NumberCodeValueType" /> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 

    <xs:simpleType name="NumberCodeValueType"> 
     <xs:restriction base="xs:int"> 
      <xs:pattern value="[0-7]{7}" /> 
     </xs:restriction> 
    </xs:simpleType> 

</xs:schema> 

बाइंडिंग।एक्सएमएल

आप एक JAXB बाइंडिंग अपने फ़ॉर्मेटर संदर्भ के लिए फाइल का लाभ उठाने होंगे:

<jxb:bindings xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb" version="2.1"> 
    <jxb:bindings schemaLocation="format.xsd"> 
     <!--jxb:bindings node="//xs:simpleType[@name='NumberCodeValueType']" --> 
     <jxb:bindings node="//xs:element[@name='number']"> 
      <jxb:property> 
       <jxb:baseType> 
        <jxb:javaType name="java.lang.Integer" 
         parseMethod="forum7182533.NumberFormatter.parseInt" printMethod="forum7182533.NumberFormatter.printInt" /> 
       </jxb:baseType> 
      </jxb:property> 
     </jxb:bindings> 
    </jxb:bindings> 
</jxb:bindings> 

XJC कॉल

बाइंडिंग फ़ाइल के रूप में XJC कॉल में संदर्भित है:

xjc -d out -p forum7182533 -b bindings.xml format.xsd 

एडाप्टर 1

इस कारण होगा एक XmlAdapter बनाया जाना है कि आपके फ़ॉर्मेटर का लाभ उठाता है:

package forum7182533; 

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

public class Adapter1 
    extends XmlAdapter<String, Integer> 
{ 


    public Integer unmarshal(String value) { 
     return (forum7182533.NumberFormatter.parseInt(value)); 
    } 

    public String marshal(Integer value) { 
     return (forum7182533.NumberFormatter.printInt(value)); 
    } 

} 

रूट

XmlAdapter@XmlJavaTypeAdapter एनोटेशन का उपयोग कर अपने डोमेन वस्तु से संदर्भित किया जाएगा:

package forum7182533; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.XmlType; 
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; 

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { 
    "number" 
}) 
@XmlRootElement(name = "root") 
public class Root { 

    @XmlElement(required = true, type = String.class) 
    @XmlJavaTypeAdapter(Adapter1 .class) 
    protected Integer number; 

    public Integer getNumber() { 
     return number; 
    } 

    public void setNumber(Integer value) { 
     this.number = value; 
    } 

} 

डेमो

अब आप निम्नलिखित डेमो कोड चलाते हैं:

package forum7182533; 

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

public class Demo { 

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

     Root root = new Root(); 
     root.setNumber(4); 

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

आउटपुट

आप वांछित उत्पादन हो जाएगी:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<root> 
    <number>0000004</number> 
</root> 
+5

+1 मैं पढ़ने के लिए परेशान नहीं किया जा सकता है पूरा जवाब लेकिन कोई भी जो उत्तर में इस प्रयास को बहुत अधिक प्रयास करता है, वह एक उत्थान के योग्य है। – Kevin

+0

@ ब्लाइज क्या आप जानते हैं कि सीधे एडाप्टर निर्दिष्ट करना संभव होगा? यह बहुत साफ होगा, लेकिन केवल अगर इसकी अनुमति है। मैंने xjc: javaType का उपयोग करने की कोशिश की लेकिन यह बेस टाइप के तहत अधिकृत नहीं प्रतीत होता है: - / –

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