आप निम्न कर सकता है:
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>
+1 मैं पढ़ने के लिए परेशान नहीं किया जा सकता है पूरा जवाब लेकिन कोई भी जो उत्तर में इस प्रयास को बहुत अधिक प्रयास करता है, वह एक उत्थान के योग्य है। – Kevin
@ ब्लाइज क्या आप जानते हैं कि सीधे एडाप्टर निर्दिष्ट करना संभव होगा? यह बहुत साफ होगा, लेकिन केवल अगर इसकी अनुमति है। मैंने xjc: javaType का उपयोग करने की कोशिश की लेकिन यह बेस टाइप के तहत अधिकृत नहीं प्रतीत होता है: - / –