第一种方式很简单,但是有缺陷,我先说说怎么弄,待会再来说缺陷。首先在pom.xml中引入需要依赖的jar文件(maven项目直接依赖就行),如果不是maven管理的话自己手动去网上下载一下jar吧,也没什么!
然后就是应用了,下图是比较正常的xml报文格式,先把我的xml报文给你们看一下吧!
import net.sf.json.xml.XMLSerializer;引入后通过JSON respJson = new XMLSerializer().read(responseXml);方法把webservice那边传过来的xml报文(responseXml)解析成JSON。然后 JSONObject jsonObject = JSONObject.fromObject(respJson);转成json对象我们就能通过相应的节点一步一步去拿到里面的值了,如果是对json比较熟悉的同学的话用这种方式应该很好理解!
但是!!!这种方式如果是碰到比较奇葩一点的xml报文的话就比较尴尬了,比如下图这种,就非得多添加几个节点!然后你用XMLSerializer()去解析的时候就会发现程序并没有那么智能,它分不清你是一个list还是一个单节点,这个时候你就得手动去处理了,没有什么好的方式。还有一点得特别注意:就是我们自己手动写了一个xml报文去做测试和你调用别人接口然后解析出来的结果是不一样的,这个也是一个比较奇葩的地方,如果有条件的话最好还是通过请求webservice接口拿到xml报文然后再去解析,别自己去写一个静态的xml报文然后解析。我就遇到过这种情况,特别坑。
第二种方式稍稍复杂一点但是比较保险,javaBean与XML双向转换(推荐)。还是先引用jar包。
拿到返回的xml报文,先分析一下xml的结构--data标签嵌套head和body;此时我们得建相应的实体类了。
body里面嵌套nbdetail标签,而body里很明显是一个list,此时我们得在body实体类中@XStreamImplicit(itemFieldName='nbdetail') private List
接下来就是把nbdetail标签下的内容表现出来了;@XStreamAlias('nbdetail')这句不能少,body下的nbdetail会通过这个找到你对应的实体类,然后关联起来!
ok,xml报文里的节点和我们的实体类都对应上了之后我们开始解析。直接上图贴代码了;//responseXml是返回的xml字符串String responseXml=contractservice.getWaitDealQueryAPPService(mProcessParamDTO);// import com.thoughtworks.xstream.XStream;别new错了哦 XStream xs = new XStream();//xml节点对应实体类 xs.alias('data', Data.class); xs.alias('head', Head.class); xs.alias('body', Body.class); xs.alias('nbdetail', NBnbdetail.class); xs.processAnnotations(new Class[] { Data.class,Head.class, Body.class,NBnbdetail.class });//通过这种方式把xml转成对象Object obj = xs.fromXML(responseXml);//强转成Data 对象 Data data = (Data) obj;//对象的get方法不就拿到了对应节点的值了吗?so easyList
别嫌我啰嗦,有的时候如果xml里面有Java的关键字的话,我们就不知道怎么建实体类了,我就碰到过。下面再说一下。先贴出xml报文吧!!!
body里面嵌套一个return标签;嘿嘿,return是Java的关键字吧?闲话不多说,直接上图解释一下。@XStreamAlias('return') private CLIsCustomerReturn cliscustomerreturn;@XStreamAlias('return')写这句话时我们得import com.thoughtworks.xstream.annotations.XStreamAlias;记得写get set方法接下来就是建CLIsCustomerReturn 实体类了,看图您就明白过来了,我们不能直接写return字段和实体类,所以我们得绕一下,双向引用。
然后就是解析xml报文了,如下图;和上面第5步是一样的,同学们看一下就明白了,在此就不多做解释了!
如果返回的xml报文比较简单的话推荐用第一种方式