如何跨格式转换数据

136 阅读2分钟

如何跨格式转换数据

问题描述


    最近因为工作调整,转向了供应链相关的工作;需要对接不同的第三方公司,每个公司的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节点中