公众号推广:
目前CSDN进行VIP可见,文章可在微信公众号进行免费的阅读。
文章内容经过认证实践,比较的清晰易懂,适合初次接触的人员。
请关注微信公众号:菜鸟编程踩坑之路,进入公众号搜索关键词 xml转实体
需求场景:
因为需要对接一些比较老的系统接口,他们的请求方式不是JSON数据结构,一般会采用xml数据结构来作为数据的入参和返参。因为我们的系统是通过JSON数据进行交互的突然接入xml数据结构的会比较的麻烦,麻烦的体现在xml数据结构比较复杂,同时如果采用字符串拼接的话会比较的难以维护。
解决方案:
将xml转为Java实体进行实体对象的操作
实现方案:
通过JAXBContext来将xml字符串转为Java实体或者把Java实体转为xml字符串
实现步骤:
1、根据xml文件生成xsd文件
首先需要准备一个jar包来帮助我们将xml文件转为xsd文件,jar下载地址可以通过公众号获取。
通过命令java -jar trang.jar test.xml test.xsd 生成xsd文件,如下图所示:
2、通过JDK将xsd文件转为实体
执行指令xjc -p com.bean test.xsd -d C:\Users\root\Desktop\test可以将test.xsd转成Java实体,文件的生成目录为C:\Users\root\Desktop\test,如下图所示:
3、Java工具类实现
/**
* 功能说明:把xml字符串解析为实体类的对象
* 修改说明:
*
* @param xml 要解析的xml字符串
* @param c 解析的目标类型
* @return 返回对应T类型的对象
* @throws JAXBException
*/
@SneakyThrows
public static <T> T xmlToEntity(String xml, Class<T> c) {
JAXBContext context = JAXBContext.newInstance(c);
Unmarshaller unmarshaller = context.createUnmarshaller();
T result = (T) unmarshaller.unmarshal(new StringReader(xml));
return result;
}
/**
* 实体转XML
*
* @param clazz
* @param object
* @return
*/
@SneakyThrows
public static String EntityToXml(Object object, Class clazz) {
JAXBContext context = JAXBContext.newInstance(clazz);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
StringWriter writer = new StringWriter();
marshaller.marshal(object, writer);
// System.out.println(writer.toString());
return writer.toString();
}
4、测试工具类
@SneakyThrows
public static void main(String[] args) {
String xmlParamSttr = "<OTA_AirTicketReShopRQ>\n" +
" <POS>\n" +
" <Source>\n" +
" <PseudoCityCode>BJS191</PseudoCityCode>\n" +
" <airlinecode>CA</airlinecode>\n" +
" <CityCode>BJS</CityCode>\n" +
" <iatacode>08000001</iatacode>\n" +
" </Source>\n" +
" </POS>\n" +
" <FlightSegments>\n" +
" <FlightSegment>\n" +
" <departure LocationCode=\"SHA\" />\n" +
" <arrival LocationCode=\"PEK\" />\n" +
" <equipment AirEquipType=\"744\" />\n" +
" <marketingCarrier Code=\"CA\" />\n" +
" <operationCarrier Code=\"CA\" />\n" +
" <flightno>CA1858</flightno>\n" +
" <departureTime>2017-10-26T07:00:00</departureTime>\n" +
" <type>NORMAL</type>\n" +
" <cabin>Y</cabin>\n" +
" <changed>true</changed>\n" +
" <actionCode>HK</actionCode>\n" +
" <TicketNumber_Before>999-5789885497</TicketNumber_Before>\n" +
" <IsInfant>false</IsInfant>\n" +
" <PassName>ZHANG/JIANXIN</PassName>\n" +
" <PassID>P1</PassID>\n" +
" <PassCount>1</PassCount>\n" +
" <InvoluntaryIdentifier>false</InvoluntaryIdentifier>\n" +
" <querydepdate>20171026</querydepdate>\n" +
" </FlightSegment>\n" +
" </FlightSegments>\n" +
"</OTA_AirTicketReShopRQ>";
OTAAirTicketReShopRQ otaAirTicketReShopRQ = xmlToEntity(xmlParamSttr, OTAAirTicketReShopRQ.class);
System.out.println(JSON.toJSONString(otaAirTicketReShopRQ));
String xmlResp = EntityToXml(otaAirTicketReShopRQ, OTAAirTicketReShopRQ.class);
System.out.println(xmlResp);
}
测试结果如下所示: