三、
JAXB
的运用:
<
xsd:schema
xmlns:xsd
="http://www.w3.org/2001/XMLSchema"
>
< xsd:element name ="purchaSEOrder" type ="PurchaSEOrderType" />
< xsd:element name ="comment" type ="xsd:string" />
< xsd:complexType name ="PurchaSEOrderType" >
< xsd:sequence >
< xsd:element name ="shipTo" type ="USAddress" />
< xsd:element name ="billTo" type ="USAddress" />
< xsd:element ref ="comment" minOccurs ="0" />
< xsd:element name ="items" type ="Items" />
</ xsd:sequence >
< xsd:attribute name ="orderDate" type ="xsd:date" />
</ xsd:complexType >
< xsd:complexType name ="USAddress" >
< xsd:sequence >
< xsd:element name ="name" type ="xsd:string" />
< xsd:element name ="street" type ="xsd:string" />
< xsd:element name ="city" type ="xsd:string" />
< xsd:element name ="state" type ="xsd:string" />
< xsd:element name ="zip" type ="xsd:decimal" />
</ xsd:sequence >
< xsd:attribute name ="country" type ="xsd:NMTOKEN" fixed ="US" />
</ xsd:complexType >
< xsd:complexType name ="Items" >
< xsd:sequence >
< xsd:element name ="item" minOccurs ="1" maxOccurs ="unbounded" >
< xsd:complexType >
< xsd:sequence >
< xsd:element name ="productName" type ="xsd:string" />
< xsd:element name ="quantity" >
< xsd:simpleType >
< xsd:restriction base ="xsd:positiveInteger" >
< xsd:maxExclusive value ="100" />
</ xsd:restriction >
</ xsd:simpleType >
</ xsd:element >
< xsd:element name ="USPrice" type ="xsd:decimal" />
< xsd:element ref ="comment" minOccurs ="0" />
< xsd:element name ="shipDate" type ="xsd:date" minOccurs ="0" />
</ xsd:sequence >
< xsd:attribute name ="partNum" type ="SKU" use ="required" />
</ xsd:complexType >
</ xsd:element >
</ xsd:sequence >
</ xsd:complexType >
<!-- StockKeepingUnit,acodeforidentifyingproducts -->
< xsd:simpleType name ="SKU" >
< xsd:restriction base ="xsd:string" >
< xsd:pattern value ="d{3}-[A-Z]{2}" />
</ xsd:restriction >
</ xsd:simpleType >
</ xsd:schema >
< xsd:element name ="purchaSEOrder" type ="PurchaSEOrderType" />
< xsd:element name ="comment" type ="xsd:string" />
< xsd:complexType name ="PurchaSEOrderType" >
< xsd:sequence >
< xsd:element name ="shipTo" type ="USAddress" />
< xsd:element name ="billTo" type ="USAddress" />
< xsd:element ref ="comment" minOccurs ="0" />
< xsd:element name ="items" type ="Items" />
</ xsd:sequence >
< xsd:attribute name ="orderDate" type ="xsd:date" />
</ xsd:complexType >
< xsd:complexType name ="USAddress" >
< xsd:sequence >
< xsd:element name ="name" type ="xsd:string" />
< xsd:element name ="street" type ="xsd:string" />
< xsd:element name ="city" type ="xsd:string" />
< xsd:element name ="state" type ="xsd:string" />
< xsd:element name ="zip" type ="xsd:decimal" />
</ xsd:sequence >
< xsd:attribute name ="country" type ="xsd:NMTOKEN" fixed ="US" />
</ xsd:complexType >
< xsd:complexType name ="Items" >
< xsd:sequence >
< xsd:element name ="item" minOccurs ="1" maxOccurs ="unbounded" >
< xsd:complexType >
< xsd:sequence >
< xsd:element name ="productName" type ="xsd:string" />
< xsd:element name ="quantity" >
< xsd:simpleType >
< xsd:restriction base ="xsd:positiveInteger" >
< xsd:maxExclusive value ="100" />
</ xsd:restriction >
</ xsd:simpleType >
</ xsd:element >
< xsd:element name ="USPrice" type ="xsd:decimal" />
< xsd:element ref ="comment" minOccurs ="0" />
< xsd:element name ="shipDate" type ="xsd:date" minOccurs ="0" />
</ xsd:sequence >
< xsd:attribute name ="partNum" type ="SKU" use ="required" />
</ xsd:complexType >
</ xsd:element >
</ xsd:sequence >
</ xsd:complexType >
<!-- StockKeepingUnit,acodeforidentifyingproducts -->
< xsd:simpleType name ="SKU" >
< xsd:restriction base ="xsd:string" >
< xsd:pattern value ="d{3}-[A-Z]{2}" />
</ xsd:restriction >
</ xsd:simpleType >
</ xsd:schema >
(1)在环境变量的系统变量的PATH中加入 <jwsdp安装目录>\jaxb\bin,(我的是C:\jwsdp-2.0\jaxb\bin;) 然后以命令行的形式运行:
….\xjc po.xsd -d src -p epri.jaxb
其中
·po.xsd 是Schema的文件名;
·-d 的选项,是指定系统生成的Java源代码所放置的目录;
·-p 的选项,是指定系统生成的Java源代码所在的Java Package的名称。
注:-d 和 -p 都可以不写,直接运行: xjc po.xsd (不建议)
例如:我们将po.xsd 放于C盘根目录下:
可以看到生成了两个java文件,它们就是po.xsd对应的实体类。
<?
xmlversion="1.0"
?>
< project basedir ="." default ="compile" >
<!-- 这里是jwsdp的安装目录 -->
< property name ="jwsdp.home" value ="C:jwsdp-2.0" />
< path id ="classpath" >
< pathelement path ="build" />
< fileset dir ="${jwsdp.home}" includes ="jaxb/lib/*.jar" />
< fileset dir ="${jwsdp.home}" includes ="jwsdp-shared/lib/*.jar" />
< fileset dir ="${jwsdp.home}" includes ="jaxp/lib/**/*.jar" />
</ path >
< taskdef name ="xjc" classname ="com.sun.tools.xjc.XJCTask" >
< classpath refid ="classpath" />
</ taskdef >
<!-- compileJavasourcefiles -->
< target name ="compile" >
<!-- generatetheJavacontentclassesfromtheschema -->
< echo message ="Compilingtheschemaexternalbindingfile..." />
< xjc schema ="po.xsd" package ="primer.po" target ="src" />
<!-- compileallofthejavasources -->
< echo message ="Compilingthejavasourcefiles..." />
</ target >
</ project >
< project basedir ="." default ="compile" >
<!-- 这里是jwsdp的安装目录 -->
< property name ="jwsdp.home" value ="C:jwsdp-2.0" />
< path id ="classpath" >
< pathelement path ="build" />
< fileset dir ="${jwsdp.home}" includes ="jaxb/lib/*.jar" />
< fileset dir ="${jwsdp.home}" includes ="jwsdp-shared/lib/*.jar" />
< fileset dir ="${jwsdp.home}" includes ="jaxp/lib/**/*.jar" />
</ path >
< taskdef name ="xjc" classname ="com.sun.tools.xjc.XJCTask" >
< classpath refid ="classpath" />
</ taskdef >
<!-- compileJavasourcefiles -->
< target name ="compile" >
<!-- generatetheJavacontentclassesfromtheschema -->
< echo message ="Compilingtheschemaexternalbindingfile..." />
< xjc schema ="po.xsd" package ="primer.po" target ="src" />
<!-- compileallofthejavasources -->
< echo message ="Compilingthejavasourcefiles..." />
</ target >
</ project >
Run As -> Ant Build XML Schema就可以生成对应的实体类,当然po.sxd 和 build.xml都应位于工程的根目录下!
Main.java:
import
java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.GregorianCalendar;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind. * ;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import javax.xml.datatype.DatatypeConfigurationException;
import primer.po. * ;
public class Main {
publicstaticvoidmain(String[]args){
try{
JAXBContextjc=JAXBContext.newInstance("primer.po");
PurchaSEOrderTypepo=newPurchaSEOrderType();
po.setorderDate(getDate());
USAddressshipTo=createUSAddress("AliceSmith",
"123MapleStreet",
"Cambridge",
"MA",
"12345");
po.setShipTo(shipTo);
USAddressbillTo=createUSAddress("RobertSmith",
"8OakAvenue",
"12345");
po.setBillTo(billTo);
Itemsitems=newItems();
List<Items.Item>itemList=items.getItem();
//startaddingItemTypeobjectsintoit
itemList.add(createItem("Nosferatu-SpecialEdition(1929)",
newBigInteger("5"),
newBigDecimal("19.99"),
null,
"242-NO"));
itemList.add(createItem("TheMummy(1959)",
newBigInteger("3"),
newBigDecimal("19.98"),
"242-MU"));
itemList.add(createItem("GodzillaandMothra:BattleforEarth/Godzillavs.KingGhidora",
newBigDecimal("27.95"),
"242-GZ"));
po.setItems(items);
JAXBElement<PurchaSEOrderType>poElement=(newObjectFactory()).createPurchaSEOrder(po);
Marshallerm=jc.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,Boolean.TRUE);
m.marshal(poElement,newFileOutputStream("test.xml"));
m.marshal(poElement,System.out);
}catch(JAXBExceptionje){
je.printstacktrace();
}catch(IOExceptionioe){
ioe.printstacktrace();
}
}
publicstaticUSAddresscreateUSAddress(Stringname,Stringstreet,
Stringcity,Stringstate,
Stringzip){
USAddressaddress=newUSAddress();
address.setName(name);
address.setStreet(street);
address.setCity(city);
address.setState(state);
address.setZip(newBigDecimal(zip));
returnaddress;
}
publicstaticItems.ItemcreateItem(StringproductName,
BigIntegerquantity,
BigDecimalprice,
Stringcomment,
XMLGregorianCalendarshipDate,
StringpartNum){
Items.Itemitem=newItems.Item();
item.setProductName(productName);
item.setQuantity(quantity);
item.setUSPrice(price);
item.setComment(comment);
item.setShipDate(shipDate);
item.setPartNum(partNum);
returnitem;
}
privatestaticXMLGregorianCalendargetDate(){
try{
returnDatatypeFactory.newInstance().newXMLGregorianCalendar(newGregorianCalendar());
}catch(DatatypeConfigurationExceptione){
thrownewError(e);
}
}
}
import java.io.IOException;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.GregorianCalendar;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind. * ;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import javax.xml.datatype.DatatypeConfigurationException;
import primer.po. * ;
public class Main {
publicstaticvoidmain(String[]args){
try{
JAXBContextjc=JAXBContext.newInstance("primer.po");
PurchaSEOrderTypepo=newPurchaSEOrderType();
po.setorderDate(getDate());
USAddressshipTo=createUSAddress("AliceSmith",
"123MapleStreet",
"Cambridge",
"MA",
"12345");
po.setShipTo(shipTo);
USAddressbillTo=createUSAddress("RobertSmith",
"8OakAvenue",
"12345");
po.setBillTo(billTo);
Itemsitems=newItems();
List<Items.Item>itemList=items.getItem();
//startaddingItemTypeobjectsintoit
itemList.add(createItem("Nosferatu-SpecialEdition(1929)",
newBigInteger("5"),
newBigDecimal("19.99"),
null,
"242-NO"));
itemList.add(createItem("TheMummy(1959)",
newBigInteger("3"),
newBigDecimal("19.98"),
"242-MU"));
itemList.add(createItem("GodzillaandMothra:BattleforEarth/Godzillavs.KingGhidora",
newBigDecimal("27.95"),
"242-GZ"));
po.setItems(items);
JAXBElement<PurchaSEOrderType>poElement=(newObjectFactory()).createPurchaSEOrder(po);
Marshallerm=jc.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,Boolean.TRUE);
m.marshal(poElement,newFileOutputStream("test.xml"));
m.marshal(poElement,System.out);
}catch(JAXBExceptionje){
je.printstacktrace();
}catch(IOExceptionioe){
ioe.printstacktrace();
}
}
publicstaticUSAddresscreateUSAddress(Stringname,Stringstreet,
Stringcity,Stringstate,
Stringzip){
USAddressaddress=newUSAddress();
address.setName(name);
address.setStreet(street);
address.setCity(city);
address.setState(state);
address.setZip(newBigDecimal(zip));
returnaddress;
}
publicstaticItems.ItemcreateItem(StringproductName,
BigIntegerquantity,
BigDecimalprice,
Stringcomment,
XMLGregorianCalendarshipDate,
StringpartNum){
Items.Itemitem=newItems.Item();
item.setProductName(productName);
item.setQuantity(quantity);
item.setUSPrice(price);
item.setComment(comment);
item.setShipDate(shipDate);
item.setPartNum(partNum);
returnitem;
}
privatestaticXMLGregorianCalendargetDate(){
try{
returnDatatypeFactory.newInstance().newXMLGregorianCalendar(newGregorianCalendar());
}catch(DatatypeConfigurationExceptione){
thrownewError(e);
}
}
}
用Java Application运行 SayHelloClient.java
输出结果: