与第三方接口对接,三方使用的xml数据格式,于是使用了JAXB做xml和java对象之间的转换。就是会封装好多和数据结构相同的javabean比较麻烦,但是于考虑到转会成json的话嵌套的层数较多,取值容易出错,所以还是选择使用了JAXB,现总结如下:
XML数据:
<OTA_HotelResRQ Version="2.1" PrimaryLangID="en-us" EchoToken="201403211401"
RetransmissionIndicator="true" xmlns="http://www.opentravel.org/OTA/2003/05"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<HotelReservations>
<HotelReservation>
<ResGuests>
<ResGuest ArrivalTime="14:30">
<Profiles>
<ProfileInfo>
<Profile>
<Customer>
<PersonName AgeQualifyingCode="10" Gender="M" Age="30">
<GivenName>Clark</GivenName>
<MiddleName>Soe</MiddleName>
<Surname>Jim </Surname>
</PersonName>
<PersonName AgeQualifyingCode="8" Gender="M" Age="4">
<GivenName>Jerry</GivenName>
<Surname>Jim </Surname>
</PersonName>
<ContactPerson ContactType="non">
<PersonName>
<GivenName>Ctrip</GivenName>
<Surname>International</Surname>
</PersonName>
<Telephone PhoneNumber="8602165342213"/>
<Email>a@b.com</Email>
</ContactPerson>
</Customer>
</Profile>
</ProfileInfo>
</Profiles>
</ResGuest>
</ResGuests>
<RatePlanDescription>
<Text Language="en-us" TextFormat="PlainText">Chrismas Promotion</Text>
</RatePlanDescription>
</HotelReservation>
</HotelReservations>
</OTA_HotelResRQ>
javaBean
应该每个节点都对应相应的名字的javaBean,这里就不一一样写出了,只列举几个有特征的bean。首先根节点OTA_HotelResRQ 对象:
/**
@XmlRootElement :根节点标签
**/
@XmlRootElement(name="OTA_HotelResRQ")
public class OTA_HotelResRQ implements Serializable{
private static final long serialVersionUID = 6594065944133388442L;
private String EchoToken;
private List<HotelReservation> HotelReservations;
public OTA_HotelResRQ(String echoToken, List<HotelReservation> hotelReservations) {
super();
EchoToken = echoToken;
HotelReservations = hotelReservations;
}
public OTA_HotelResRQ() {
super();
}
public List<HotelReservation> getHotelReservations() {
return HotelReservations;
}
/**
@XmlElementWrapper:有list集合时使用
@XmlElement:XML的元素标签
**/
@XmlElementWrapper(name="HotelReservations")
@XmlElement(name="HotelReservation")
public void setHotelReservations(List<HotelReservation> hotelReservations) {
HotelReservations = hotelReservations;
}
public String getEchoToken() {
return EchoToken;
}
/**
@XmlAttribute:XML的属性标签
**
@XmlAttribute(name="EchoToken")
public void setEchoToken(String echoToken) {
EchoToken = echoToken;
}
}
Customer标签层有多个personName节点此时需要,此时需要定义一个list集合,刚Customer对象定义如下:
public class Customer implements Serializable{
private static final long serialVersionUID = 7225574002375905961L;
@XmlElement(name="PersonName")
private List<PersonName> PersonNames;
private ContactPerson ContactPerson;
public List<PersonName> getPersonNames() {
return PersonNames;
}
public void setPersonNames(List<PersonName> personNames) {
PersonNames = personNames;
}
public ContactPerson getContactPerson() {
return ContactPerson;
}
@XmlElement(name="ContactPerson")
public void setContactPerson(ContactPerson contactPerson) {
ContactPerson = contactPerson;
}
}
Text标签既有属性,又有值 ,如下定义:
public class Text implements Serializable{
private static final long serialVersionUID = -7475419099742497253L;
private String Language;
private String TextFormat;
private String Text;
public String getLanguage() {
return Language;
}
@XmlAttribute(name="Language")
public void setLanguage(String language) {
Language = language;
}
public String getTextFormat() {
return TextFormat;
}
@XmlAttribute(name="TextFormat")
public void setTextFormat(String textFormat) {
TextFormat = textFormat;
}
public String getText() {
return Text;
}
/**
@XmlValue : 接收节点值 的标签
**/
@XmlValue
public void setText(String text) {
Text = text;
}
}
controller层
@RequestMapping(value = "/createReservation", consumes = "application/xml", method = RequestMethod.POST)
@ResponseBody
public String createReservation(@RequestBody OTA_HotelResRQ reservationObj, HttpServletRequest request)
throws Exception {
HotelReservation hotelReservation = reservationObj.getHotelReservations().get(0);
}
这样便完成了xml转换成java对象
java对象转XML
xml数据格式
<OTA_HotelResRS Version="2.1" EchoToken="201403211421"
xmlns="http://www.opentravel.org/OTA/2003/05" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Errors>
<Error ShortText="Property 54395 is not a valid property code" Type="3" Code="400"/>
</Errors>
<HotelReservations>
<HotelReservation ResStatus="R">
<ResGlobalInfo>
<HotelReservationIDs>
<HotelReservationID ResID_Value="859623" ResID_Type="501"/>
</HotelReservationIDs>
</ResGlobalInfo>
</HotelReservation>
</HotelReservations>
</OTA_HotelResRS>
javaBean
@XmlRootElement(name="OTA_HotelResRS")
public class OTA_HotelResRS implements Serializable {
private static final long serialVersionUID = 8908009209610550489L;
private String Version;
private String EchoToken;
private String xmlns;
private Success Success;
private HotelReservations HotelReservations;
private Warnings Warnings;
@XmlAttribute(name = "Version")
public String getVersion() {
return Version;
}
public void setVersion(String version) {
Version = version;
}
@XmlAttribute(name = "EchoToken")
public String getEchoToken() {
return EchoToken;
}
public void setEchoToken(String echoToken) {
EchoToken = echoToken;
}
@XmlAttribute(name = "xmlns")
public String getXmlns() {
return xmlns;
}
public void setXmlns(String xmlns) {
this.xmlns = xmlns;
}
@XmlElement(name="Success")
public Success getSuccess() {
return Success;
}
public void setSuccess(Success success) {
Success = success;
}
@XmlElement(name = "HotelReservations")
public HotelReservations getHotelReservations() {
return HotelReservations;
}
public void setHotelReservations(HotelReservations hotelReservations) {
HotelReservations = hotelReservations;
}
}
controller层
@RequestMapping(value = "/createReservation", consumes = "application/xml", method = RequestMethod.POST)
@ResponseBody
public String createReservation(@RequestBody OTA_HotelResRQ reservationObj, HttpServletRequest request)
throws Exception {
// 获得转换的上下文对象
JAXBContext context = JAXBContext.newInstance(OTA_HotelResRS.class);
// 获得Marshaller对象
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
// 将java对象进行转换成xml respobnse为封装好要返回的java对象
OTA_HotelResRS response = new OTA_HotelResRS();
marshaller.marshal(response, writer);
String XmlString = writer.toString();
System.out.println(XmlString);
return responseXml;
}