JAXB java对象和XML的转换

与第三方接口对接,三方使用的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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值