解析XML的两种方式XStream和Dom4j

    最近在做的这个项目(对接银行),请求过来的报文格式为XML,解析方式也一直用的是XStream。在用的过程中发现其特点,转换成JavaBean很方便。

   都开发完了,测试的时候,银行反馈一直报节点错误,导致测试进度进行不下去。(当时心想按你们接口文档开发的,你们请求过来的报文和接口文档不一致,还怪谁。)但是问题还是要解决的,安抚内心的小情绪,给他们沟通为什么会导致这种情况。

    了解后发现,银行没有统一的接口文档(或者是没有固定的接口文档),听到这个消息我震惊了,对接了那么多家银行,怎么会有银行这么奇葩。银行方面的解释是,他们对接很多家保险公司,每一家保险公司又需求变更的话,银行方面都会修改字段(变更比较频繁)。而银行就会把修改后的报文信息一股脑的给到各家对接的保险公司。而各个保险公司都会接收他们的报文,然后从中取到他们需要的字段。

   XStream解析,报文中的字段少是可以正常解析的,但是字段多的话就不能正常解析了。那这种方式就会解析不了他们的报文。怎么办呢,改吧。银行爸爸不会为一家保险公司定制一套报文,那样成本会高很多。

   扒拉一下代码,把XStream转DTO的那段代码注释掉,新起一个方法,用了Dom4j解析请求过来的报文,只去取自己用到字段。改起来还是很快的,然后继续测试,没有延误工期。

   原来的方式,就是我建了一个门(这个规则由我制定),你的长度和宽度(内容)只能小于等于我的门的规格,你(数据)才能进来。

   另一种方式呢,就相当于你有你和家人有一大堆旧衣服,然后你家的穷亲戚都来了,他们需要穿多大的衣服自己知道,然后就去这堆衣服里面去扒拉,找到自己能穿的衣服,然后走了。(这个比喻可能不太恰当,大致就是这个意思。)

   刚开始进行修改的时候心里可能还有一点不忿。自己一直都是个很怂的人,即使抱怨也不会让别人听见,别人就以为我没意见。但是从技术角度上分析,假如说遇到一个问题,领导比较强势,直接让对接的合作方去改,去适应你。你可能不会多另一个视角去看待一个问题。但是谁又不想靠个大树好乘凉呢。

具体的XStream和Dom4j解析XML的细节和怎样操作的内容,请参考下面的一篇博客,里面有详细的讲解,一看就能上手

https://blog.csdn.net/thunder09/article/details/5555946

-------------------------------------------这是一个洗心革面的分界线---------------------------------------------------------

昨天刚写的,今天就被打脸。还好0访问量,赶紧把评论加上,
XStream可以忽略多节点的情况。
XStream老版本可能没有这个函数(应该是1.4.5以上版本)
ignoreUnknownElements(); 
ignoreUnknownElements(String pattern);

 

在XStream解析报文的时候,只要加上ignoreUnknownElements(); 这句,无论是多节点还是少节点都能够解析。

上代码,新建一个实体类,四个属性,先打印出来报文。去掉一个属性的节点,再加上原来没有的节点也能正常解析。

import com.thoughtworks.xstream.annotations.XStreamAlias;

@XStreamAlias("dog")
public class dog {
    private String name;
    private String age;
    private String color;
    private String clothes;


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public String getClothes() {
        return clothes;
    }

    public void setClothes(String clothes) {
        this.clothes = clothes;
    }
}
import com.sinosoft.light.dataswitch.service.model.tpain.LisCallResponseDTO;
import com.thoughtworks.xstream.XStream;

public class TestDogXml {

    public static void main(String[] args) {
        dog Ahuang = new dog();
        Ahuang.setAge("2");
        Ahuang.setColor("Yellow");
        Ahuang.setName("阿黄");

        XStream xstream = new XStream();
        xstream.processAnnotations(dog.class);

        System.out.println("打印阿黄的报文:" + xstream.toXML(Ahuang));

        String reqXml = "\n" +
                "  阿黄\n" +
                "  2\n" +
                "  Yellow\n" +
                "  YYY\n" +
                "";

        xstream.ignoreUnknownElements();
        Object objs = xstream.fromXML(reqXml);
        dog resDod = (dog) objs;

        System.out.println("名字:" + resDod.getName());
    }


}

可以正常解析,打印结果如下:

打印阿黄的报文:
  阿黄
  2
  Yellow

名字:阿黄

 

由此可见,可以正常解析。

想想原来改用dom4j解析的时候,如果知道一行代码可以解决的时候,我还会做那么多的无用功嘛。

这次真的是明白了 知识就是力量,拥有知识,可以节省你的时间,遇到问题能最高效的处理问题。

你可能感兴趣的:(JAVA)