由xml文件动态生成Java类

JAXB(Java Architecture for XML Binding)是一种特殊的序列化/反序列化工具。它可以使XML数据以Java Objects的形式直接应用于Java程序之中,使Java Objects与XML数据之间的转换成为可能。在JAXB中将Java Objects到XML数据的转换称为marshal;XML数据到Java Objects的转换称为unmarshal。
使用JAXB分两步,首先利用xjc命令行程序编译DTD或Schema文件生成与XML数据结构相对应的JavaBeans类,再通过JAXB API中的marshal与unmarshal操作完成JavaBeans对象与XML数据之间的互换。
JAXB使用了最新的元数据技术,故而只能在JDK 1.5以上版本使用,JAXB的官方网站如下:
[list]
[*]https://jaxb.dev.java.net/
[/list]
1. 通过命令行编译
命令行程序xjc用于编译DTD或Schema生成与XML数据结构对应的JavaBeans类。操作方法如下:
xjc [-xmlschema|-dtd] [–d 保存java文件的目录] [–p java文件所在的包] <编译文件>

-xmlschema 指定编译文件的格式为Schema格式,此参数是默认值,可以不用提供。
如果不提供此参数,编译文件必须是Schema文件。
-dtd 指定编译文件的格式为DTD格式,如果编译文件是DTD文件则必须提供此参数。
-d 指定了保存java文件的目录
-p 指定了生成的java文件所在的包

例如编译当前目录下的schema.xls文件,java文件保存在src目录,包名为generate,其命令如下:
xjc –d src –p generate schema.xsd
如果编译文件是schema.dta,则命令如下:
xjc –dtd –d src –p generate schema.dtd

2. 通过ANT编译
在/JAXB-HOME/lib目录中的jaxb-xjc.jar包中包含了XJCTask.class文件,可以依据该类定义一个ant task,通过执行该task生成java文件,这种方法我暂时没有测试!

其中我测试了一个比较复杂的xml文件,其xsd文件如:
<xs:schema xmlns:tns="http://schemas.datacontract.org/2004/07/DataExchange.Utility.BussinessObject" elementFormDefault="qualified" targetNamespace="http://schemas.datacontract.org/2004/07/DataExchange.Utility.BussinessObject" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="ShippingOrder">
<xs:sequence>
<xs:element minOccurs="0" name="acceptTime" type="xs:dateTime" />
<xs:element minOccurs="0" name="agencyPrice" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="billId" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="billingPersonName" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="branchName" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="chargeType" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="checkTime" type="xs:dateTime" />
<xs:element minOccurs="0" name="consigneeCardNO" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="consigneeInfomation" nillable="true" type="tns:ConsigneeInfomation" />
<xs:element minOccurs="0" name="consigneeName" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="consigneeSignName" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="consignorInfomation" nillable="true" type="tns:ConsignorInfomation" />
<xs:element minOccurs="0" name="consignorName" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="endStationName" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="goodsInfomations" nillable="true" type="tns:ArrayOfGoodsInfomation" />
<xs:element minOccurs="0" name="isInsurance" type="xs:boolean" />
<xs:element minOccurs="0" name="isRouteRecord" type="xs:boolean" />
<xs:element minOccurs="0" name="labelId" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="limitTime" type="xs:dateTime" />
<xs:element minOccurs="0" name="packageBillId" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="prepayPrice" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="procedureCharge" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="remark" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="route" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="routePersonName" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="sendStationName" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="stationName" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="totalCharge" type="xs:float" />
<xs:element minOccurs="0" name="totalCount" type="xs:int" />
<xs:element minOccurs="0" name="totalWeight" type="xs:float" />
<xs:element minOccurs="0" name="transferName" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="travelTime" type="xs:dateTime" />
</xs:sequence>
</xs:complexType>
<xs:element name="ShippingOrder" nillable="true" type="tns:ShippingOrder" />
<xs:complexType name="ConsigneeInfomation">
<xs:sequence>
<xs:element minOccurs="0" name="addressTel" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="consigneeCode" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="consigneeUserID" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="consignmentStatus" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="gatheringAmount" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="gatheringType" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="goodsReceiptPlace" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="isReturn" type="xs:boolean" />
<xs:element minOccurs="0" name="linkManName" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="originalEnterprise" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="originalNumber" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="remark" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="requestedUnloadedDateTime" type="xs:dateTime" />
<xs:element minOccurs="0" name="telephoneNumber" nillable="true" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:element name="ConsigneeInfomation" nillable="true" type="tns:ConsigneeInfomation" />
<xs:complexType name="ConsignorInfomation">
<xs:sequence>
<xs:element minOccurs="0" name="addressTel" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="consignorCode" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="linkManName" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="loadingPlace" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="telephoneNumber" nillable="true" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:element name="ConsignorInfomation" nillable="true" type="tns:ConsignorInfomation" />
<xs:complexType name="ArrayOfGoodsInfomation">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="GoodsInfomation" nillable="true" type="tns:GoodsInfomation" />
</xs:sequence>
</xs:complexType>
<xs:element name="ArrayOfGoodsInfomation" nillable="true" type="tns:ArrayOfGoodsInfomation" />
<xs:complexType name="GoodsInfomation">
<xs:sequence>
<xs:element minOccurs="0" name="chargeType" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="excursionFreight" type="xs:float" />
<xs:element minOccurs="0" name="freight" type="xs:float" />
<xs:element minOccurs="0" name="goodsBar" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="goodsBatchNumber" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="goodsGuid" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="goodsName" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="goodsSpecification" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="goodsType" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="goodsTypeCode" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="grossWeightUnitCode" type="xs:float" />
<xs:element minOccurs="0" name="grossWeightValue" type="xs:float" />
<xs:element minOccurs="0" name="insurancePrice" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="isInsurance" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="packageType" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="packageTypeCode" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="packagesNumber" type="xs:int" />
<xs:element minOccurs="0" name="remart" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="volumeUnitCode" nillable="true" type="xs:string" />
<xs:element minOccurs="0" name="volumeValue" type="xs:float" />
</xs:sequence>
</xs:complexType>
<xs:element name="GoodsInfomation" nillable="true" type="tns:GoodsInfomation" />
</xs:schema>

这个目标期望可以生成的类有:ShippingOder,GoodsInformation,ConsigneeInformation和ConsignorInformation
但测试生成的类有除了上面那四个外,还有三个:package-info,ObjectFactory,ArrayOfGoodsInfomation
如ShippingOrder这个类中部分代码如下:
public class ShippingOrder {

@XmlSchemaType(name = "dateTime")
protected XMLGregorianCalendar acceptTime;
@XmlElementRef(name = "agencyPrice", namespace = "http://schemas.datacontract.org/2004/07/DataExchange.Utility.BussinessObject", type = JAXBElement.class, required = false)
protected JAXBElement<String> agencyPrice;
@XmlElementRef(name = "billId", namespace = "http://schemas.datacontract.org/2004/07/DataExchange.Utility.BussinessObject", type = JAXBElement.class, required = false)
protected JAXBElement<String> billId;
@XmlElementRef(name = "billingPersonName", namespace = "http://schemas.datacontract.org/2004/07/DataExchange.Utility.BussinessObject", type = JAXBElement.class, required = false)
protected JAXBElement<String> billingPersonName;
@XmlElementRef(name = "branchName", namespace = "http://schemas.datacontract.org/2004/07/DataExchange.Utility.BussinessObject", type = JAXBElement.class, required = false)
protected JAXBElement<String> branchName;
@XmlElementRef(name = "chargeType", namespace = "http://schemas.datacontract.org/2004/07/DataExchange.Utility.BussinessObject", type = JAXBElement.class, required = false)
protected JAXBElement<String> chargeType;
@XmlSchemaType(name = "dateTime")
protected XMLGregorianCalendar checkTime;
@XmlElementRef(name = "consigneeCardNO", namespace = "http://schemas.datacontract.org/2004/07/DataExchange.Utility.BussinessObject", type = JAXBElement.class, required = false)
protected JAXBElement<String> consigneeCardNO;
@XmlElementRef(name = "consigneeInfomation", namespace = "http://schemas.datacontract.org/2004/07/DataExchange.Utility.BussinessObject", type = JAXBElement.class, required = false)
protected JAXBElement<ConsigneeInfomation> consigneeInfomation;
@XmlElementRef(name = "consigneeName", namespace = "http://schemas.datacontract.org/2004/07/DataExchange.Utility.BussinessObject", type = JAXBElement.class, required = false)
protected JAXBElement<String> consigneeName;
@XmlElementRef(name = "consigneeSignName", namespace = "http://schemas.datacontract.org/2004/07/DataExchange.Utility.BussinessObject", type = JAXBElement.class, required = false)
protected JAXBElement<String> consigneeSignName;
@XmlElementRef(name = "consignorInfomation", namespace = "http://schemas.datacontract.org/2004/07/DataExchange.Utility.BussinessObject", type = JAXBElement.class, required = false)
protected JAXBElement<ConsignorInfomation> consignorInfomation;
@XmlElementRef(name = "consignorName", namespace = "http://schemas.datacontract.org/2004/07/DataExchange.Utility.BussinessObject", type = JAXBElement.class, required = false)
protected JAXBElement<String> consignorName;
@XmlElementRef(name = "endStationName", namespace = "http://schemas.datacontract.org/2004/07/DataExchange.Utility.BussinessObject", type = JAXBElement.class, required = false)
protected JAXBElement<String> endStationName;
@XmlElementRef(name = "goodsInfomations", namespace = "http://schemas.datacontract.org/2004/07/DataExchange.Utility.BussinessObject", type = JAXBElement.class, required = false)
protected JAXBElement<ArrayOfGoodsInfomation> goodsInfomations;
protected Boolean isInsurance;
protected Boolean isRouteRecord;
@XmlElementRef(name = "labelId", namespace = "http://schemas.datacontract.org/2004/07/DataExchange.Utility.BussinessObject", type = JAXBElement.class, required = false)
protected JAXBElement<String> labelId;
@XmlSchemaType(name = "dateTime")
protected XMLGregorianCalendar limitTime;
@XmlElementRef(name = "packageBillId", namespace = "http://schemas.datacontract.org/2004/07/DataExchange.Utility.BussinessObject", type = JAXBElement.class, required = false)
protected JAXBElement<String> packageBillId;
@XmlElementRef(name = "prepayPrice", namespace = "http://schemas.datacontract.org/2004/07/DataExchange.Utility.BussinessObject", type = JAXBElement.class, required = false)
protected JAXBElement<String> prepayPrice;
@XmlElementRef(name = "procedureCharge", namespace = "http://schemas.datacontract.org/2004/07/DataExchange.Utility.BussinessObject", type = JAXBElement.class, required = false)
protected JAXBElement<String> procedureCharge;
@XmlElementRef(name = "remark", namespace = "http://schemas.datacontract.org/2004/07/DataExchange.Utility.BussinessObject", type = JAXBElement.class, required = false)
protected JAXBElement<String> remark;
@XmlElementRef(name = "route", namespace = "http://schemas.datacontract.org/2004/07/DataExchange.Utility.BussinessObject", type = JAXBElement.class, required = false)
protected JAXBElement<String> route;
@XmlElementRef(name = "routePersonName", namespace = "http://schemas.datacontract.org/2004/07/DataExchange.Utility.BussinessObject", type = JAXBElement.class, required = false)
protected JAXBElement<String> routePersonName;
@XmlElementRef(name = "sendStationName", namespace = "http://schemas.datacontract.org/2004/07/DataExchange.Utility.BussinessObject", type = JAXBElement.class, required = false)
protected JAXBElement<String> sendStationName;
@XmlElementRef(name = "stationName", namespace = "http://schemas.datacontract.org/2004/07/DataExchange.Utility.BussinessObject", type = JAXBElement.class, required = false)
protected JAXBElement<String> stationName;
protected Float totalCharge;
protected Integer totalCount;
protected Float totalWeight;
@XmlElementRef(name = "transferName", namespace = "http://schemas.datacontract.org/2004/07/DataExchange.Utility.BussinessObject", type = JAXBElement.class, required = false)
protected JAXBElement<String> transferName;
@XmlSchemaType(name = "dateTime")
protected XMLGregorianCalendar travelTime;
//getter,setter
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值