主要是注意JAXB的注解的使用@XmlRootElement(根节点)、@XmlElement(子节点)、@XmlAttribute(节点属性)
如解析如下xml文档:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <insuredInfo> <insuredName>hehongbo</insuredName> <insuredIdentifyType>1</insuredIdentifyType> <insuredIdentifyNumber>430611198307215013</insuredIdentifyNumber> <insuredMobile>13243764322</insuredMobile> <insuredEmail>[email protected]</insuredEmail> </insuredInfo>
需要转换的java对象:
package com.cheyooh.service.dal.db.dto.api.dadi; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "insuredInfo") public class InsuredInfo { private String insuredName; private String insuredIdentifyType; private String insuredIdentifyNumber; private String insuredMobile; private String insuredEmail; @XmlElement(name = "insuredName") public String getInsuredName() { return insuredName; } public void setInsuredName(String insuredName) { this.insuredName = insuredName; } @XmlElement(name = "insuredIdentifyType") public String getInsuredIdentifyType() { return insuredIdentifyType; } public void setInsuredIdentifyType(String insuredIdentifyType) { this.insuredIdentifyType = insuredIdentifyType; } @XmlElement(name = "insuredIdentifyNumber") public String getInsuredIdentifyNumber() { return insuredIdentifyNumber; } public void setInsuredIdentifyNumber(String insuredIdentifyNumber) { this.insuredIdentifyNumber = insuredIdentifyNumber; } @XmlElement(name = "insuredMobile") public String getInsuredMobile() { return insuredMobile; } public void setInsuredMobile(String insuredMobile) { this.insuredMobile = insuredMobile; } @XmlElement(name = "insuredEmail") public String getInsuredEmail() { return insuredEmail; } public void setInsuredEmail(String insuredEmail) { this.insuredEmail = insuredEmail; } }
如果再一个xml文档子节点下还有一个子节点,如何映射呢?
对于这个问题,需要再java对象中什么的时候,子节点属性不能只是简单的java对象,而是要声明为List对象,如:private List<Request> request;
xml:
<?xml version="1.0" encoding="GBK"?> <message finishTime=”2011-12-25 12:00:00”> <!--from里为sellerId,需要与GET请求里所传参数保持一致 --> <request func=" car_info_sync" return=”true” from=”*****”> <content> <orderInfo> <name>用户名称</name> <mobile>手机号码</mobile> <email>电子邮件地址</email> <carLicence>车牌号</carLicence> <!—车辆行驶城市代码 六位 --> <cityCode>xxxxxx</cityCode> <!—车辆登记日期,到日或者到月 --> <registerDate>YYYY-MM-DD 或者 YYYY-MM</registerDate> <!—商业险生效日期 --> <bizBeginDate>YYYY-MM-DD</bizBeginDate> <!—交强险生效日期 --> <forBeginDate>YYYY-MM-DD</forBeginDate> <utmsn>123456</utmsn> </orderInfo> </content> </request> </message>
java对象:
package com.cheyooh.service.dal.db.dto.api.dadi; import java.util.List; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "message") public class Message { private String finishTime; private List<Request> request; @XmlAttribute(name = "finishTime") public String getFinishTime() { return finishTime; } public void setFinishTime(String finishTime) { this.finishTime = finishTime; } @XmlElement(name = "request") public List<Request> getRequest() { return request; } public void setRequest(List<Request> request) { this.request = request; } @Override public String toString() { return "Message [finishTime=" + finishTime + ", request=" + request + "]"; } }
这里可以看到,message节点中的request子节点映射为list集合,但是get方法中是注解仍然是@XmlElement。
request对象的声明:
package com.cheyooh.service.dal.db.dto.api.dadi; import java.util.List; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "request") public class Request { private String func; private String returnAttribute; private String from; private List<Content> content; @XmlAttribute(name = "func") public String getFunc() { return func; } public void setFunc(String func) { this.func = func; } @XmlElement(name = "content") public List<Content> getContent() { return content; } public void setContent(List<Content> content) { this.content = content; } @XmlAttribute(name = "return") public String getReturnAttribute() { return returnAttribute; } public void setReturnAttribute(String returnAttribute) { this.returnAttribute = returnAttribute; } @XmlAttribute(name = "from") public String getFrom() { return from; } public void setFrom(String from) { this.from = from; } }
request节点中的content子节点对象:
package com.cheyooh.service.dal.db.dto.api.dadi; import java.util.List; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "content") public class Content { private List<OrderInfo> orderInfo; @XmlElement(name = "orderInfo") public List<OrderInfo> getOrderInfo() { return orderInfo; } public void setOrderInfo(List<OrderInfo> orderInfo) { this.orderInfo = orderInfo; } }
最后是orderInfo节点的对象映射:
package com.cheyooh.service.dal.db.dto.api.dadi; import java.util.List; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "orderInfo") public class OrderInfo { private String chanceCreateTime; //商机进入时间 private String startDate; //起保日期 private String insuranceApplicantNo; //投保单号 private Double premium; //总保费 private String insuranceType; //投保单类型 private String utmsn; //合作方订单号 private String paymentNo; //支付申请号 private String paymentTime; //支付申请时间 private String policyNo; //保单号 private String effectdate; //保单生效时间 private List<Commercial> commercial; //商业险信息 private List<Compulsory> compulsory; //交强险信息 private List<VehicleInfo> vehicleInfo; //车辆信息 private List<ApplicantInfo> applicantInfo; //投保人信息 private List<InsuredInfo> insuredInfo; //被保人信息 private List<DistributionInfo> distributionInfo; //配送信息 private String name;// 姓名 private String mobile;// 手机号 private String email;// 邮箱 private String carLicence;// 车牌号 private String cityCode; private String registerDate; private String bizBeginDate; private String forBeginDate; @XmlElement(name = "name") public String getName() { return name; } public void setName(String name) { this.name = name; } @XmlElement(name = "mobile") public String getMobile() { return mobile; } public void setMobile(String mobile) { this.mobile = mobile; } @XmlElement(name = "email") public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } @XmlElement(name = "carLicence") public String getCarLicence() { return carLicence; } public void setCarLicence(String carLicence) { this.carLicence = carLicence; } @XmlElement(name = "cityCode") public String getCityCode() { return cityCode; } public void setCityCode(String cityCode) { this.cityCode = cityCode; } @XmlElement(name = "registerDate") public String getRegisterDate() { return registerDate; } public void setRegisterDate(String registerDate) { this.registerDate = registerDate; } @XmlElement(name = "bizBeginDate") public String getBizBeginDate() { return bizBeginDate; } public void setBizBeginDate(String bizBeginDate) { this.bizBeginDate = bizBeginDate; } @XmlElement(name = "forBeginDate") public String getForBeginDate() { return forBeginDate; } public void setForBeginDate(String forBeginDate) { this.forBeginDate = forBeginDate; } @XmlElement(name = "applicantInfo") public List<ApplicantInfo> getApplicantInfo() { return applicantInfo; } public void setApplicantInfo(List<ApplicantInfo> applicantInfo) { this.applicantInfo = applicantInfo; } @XmlElement(name = "insuredInfo") public List<InsuredInfo> getInsuredInfo() { return insuredInfo; } public void setInsuredInfo(List<InsuredInfo> insuredInfo) { this.insuredInfo = insuredInfo; } @XmlElement(name = "distributionInfo") public List<DistributionInfo> getDistributionInfo() { return distributionInfo; } public void setDistributionInfo(List<DistributionInfo> distributionInfo) { this.distributionInfo = distributionInfo; } @XmlElement(name = "chanceCreateTime") public String getChanceCreateTime() { return chanceCreateTime; } public void setChanceCreateTime(String chanceCreateTime) { this.chanceCreateTime = chanceCreateTime; } @XmlElement(name = "startDate") public String getStartDate() { return startDate; } public void setStartDate(String startDate) { this.startDate = startDate; } @XmlElement(name = "insuranceApplicantNo") public String getInsuranceApplicantNo() { return insuranceApplicantNo; } public void setInsuranceApplicantNo(String insuranceApplicantNo) { this.insuranceApplicantNo = insuranceApplicantNo; } @XmlElement(name = "premium") public Double getPremium() { return premium; } public void setPremium(Double premium) { this.premium = premium; } @XmlElement(name = "insuranceType") public String getInsuranceType() { return insuranceType; } public void setInsuranceType(String insuranceType) { this.insuranceType = insuranceType; } @XmlElement(name = "utmsn") public String getUtmsn() { return utmsn; } public void setUtmsn(String utmsn) { this.utmsn = utmsn; } @XmlElement(name = "commercial") public List<Commercial> getCommercial() { return commercial; } public void setCommercial(List<Commercial> commercial) { this.commercial = commercial; } @XmlElement(name = "compulsory") public List<Compulsory> getCompulsory() { return compulsory; } public void setCompulsory(List<Compulsory> compulsory) { this.compulsory = compulsory; } @XmlElement(name = "vehicleInfo") public List<VehicleInfo> getVehicleInfo() { return vehicleInfo; } public void setVehicleInfo(List<VehicleInfo> vehicleInfo) { this.vehicleInfo = vehicleInfo; } @XmlElement(name = "paymentNo") public String getPaymentNo() { return paymentNo; } public void setPaymentNo(String paymentNo) { this.paymentNo = paymentNo; } @XmlElement(name = "paymentTime") public String getPaymentTime() { return paymentTime; } public void setPaymentTime(String paymentTime) { this.paymentTime = paymentTime; } @XmlElement(name = "policyNo") public String getPolicyNo() { return policyNo; } public void setPolicyNo(String policyNo) { this.policyNo = policyNo; } @XmlElement(name = "effectdate") public String getEffectdate() { return effectdate; } public void setEffectdate(String effectdate) { this.effectdate = effectdate; } }
至此,JAXB就完成了对复杂XML文档的映射解析,除了需要注意子节点集合映射为list集合之外,注解的关键字必须要正确,否则取不到内容。