如何跨格式转换数据
问题描述
最近因为工作调整,转向了供应链相关的工作;需要对接不同的第三方公司,每个公司的http接口返回或者请求的数据格式不一,有些公司使的报文使用xml,有些公司
使用json;不可能每次对接第三方,我们都要写一个javabean去适配他们的数据结构,所以如何处理和转换这种数据就显得尤为重要。
我们都知道json、xml、javaBean之间可以互相转换,为了解决这个问题;我们需要寻找到一个能作为中间转换的数据类型,它既能转换为不同格式的数据类型,也
能支持同一种类型中数据结构进行优雅转换,并且能简化开发,减少系统压力。json可以可以实现转换为不同格式的数据类型,但是无法满足同类型数据结构的优雅转换
;javaBean可以实现不同格式的数据,但是不能简化开发,因为需要写不同的java对象去转换相关的数据结构。反观xml,则能满足上诉基本的条件。那我们可以使用xml作为中间的转换类型,统一使用xml进行转换。
如何使用
1. 编写转换类
public String transform(String str, String model) {
logger.info("开始转换xml,报文内容为:: " + str);
StringReader strReader = null;
StringReader modelReader = null;
StringWriter writer = new StringWriter();
String result = null;
try {
strReader = new StringReader(str);
modelReader = new StringReader(model);
TransformerFactory factory = TransformerFactory.newInstance();
Source xslt = new StreamSource(modelReader);
xslt.setSystemId(XSL_EXAMPLE_MODEL);
Transformer transformer = factory.newTransformer(xslt);
Source text = new StreamSource(strReader);
text.setSystemId(XML_EXAMPLE_MODEL);
transformer.transform(text, new StreamResult(writer));
strReader.close();
strReader = null;
modelReader.close();
modelReader = null;
if (writer != null) {
result = writer.getBuffer().toString();
logger.info("报文转换结果为: " + result);
return result;
}
} catch (Exception e) {
logger.error(e.getMessage());
} finally {
try {
strReader.close();
strReader = null;
modelReader.close();
modelReader = null;
writer.flush();
writer.close();
} catch (Exception e) {
}
writer = null;
}
return null;
}
其中str为转换前的xml报文,model为转换时调用的本地xsl文件;
2. 编写xsl文件,解析第三方的报文。
如下图所示,能把根节点为Root的Msg节点的信息赋给msg节点中