一、样例一:

    以根据订单号向支付宝查询支付是否成功为例(成功信息)

    失败信息:

    <?xml version="1.0" encoding="utf-8"?>

      <alipay>
        <is_success>F</is_success>
        <error>TRADE_NOT_EXIST</error>
      </alipay>

    成功信息:

    <?xml version="1.0" encoding="utf-8"?>

      <alipay>
        <is_success>T</is_success>
          <request>
            <param name="_input_charset">utf-8</param>
            <param name="service">single_trade_query</param>
            <param name="partner">2088121424678319</param>
            <param name="out_trade_no">H161021114440198N</param>
          </request>
          <response>
            <trade>
              <body>订单:T16102111443568</body>
              <buyer_email>1176760525@qq.com</buyer_email>
              <buyer_id>2088402231747066</buyer_id>
              <discount>0.00</discount>
              <flag_trade_locked>0</flag_trade_locked>
              <gmt_create>2016-10-21 11:45:06</gmt_create>
              <gmt_last_modified_time>2016-10-21 11:45:16</gmt_last_modified_time>
              <gmt_payment>2016-10-21 11:45:17</gmt_payment>
              <is_total_fee_adjust>F</is_total_fee_adjust>
              <operator_role>B</operator_role>
              <out_trade_no>H161021114440198N</out_trade_no>
              <payment_type>1</payment_type>
              <price>0.01</price>
              <quantity>1</quantity>
              <seller_email>pay@gstarcad.com</seller_email>
              <seller_id>2088121424678319</seller_id>
              <subject>的生活费...</subject>
              <time_out>2017-01-20 11:45:17</time_out>
              <time_out_type>finishFPAction</time_out_type>
              <to_buyer_fee>0.00</to_buyer_fee>
              <to_seller_fee>0.01</to_seller_fee>
              <total_fee>0.01</total_fee>
              <trade_no>2016102121001004060245497067</trade_no>
              <trade_status>TRADE_SUCCESS</trade_status>
              <use_coupon>F</use_coupon>
            </trade>
           </response>
           <sign>25217c932f49868371a301e3151201a2</sign>
           <sign_type>MD5</sign_type>
        </alipay>

    首先解析is_success字段的值,看看结果是T(成功)还是F(失败),具体就不详细作解释,这里只分析为T时的数据,一定要判断,否则若为F再解析因XML格式不一会报错

    Map<Object, Object> map = new HashMap<Object, Object>();

    map = XMLUtil.doXMLParse(result);
    String is_success = map.get("is_success").toString();

  1、工具类XStreamHandle中定义两个方法:   

  /**

     * 实体转xml字符串

   * @param obj

      * @return

    */

  public static String toXml(Object obj) {

   XStream xstream = new XStream(new DomDriver("utf8"));

  xstream.processAnnotations(obj.getClass()); // 识别obj类中的注解

  return xstream.toXML(obj);

   }

   /**

   * 字符串转实体

   * @param xmlStr

   * @param cls

  * @return

   */

   public static <T> T toBean(String xmlStr, Class<T> cls) {

     XStream xstream = new XStream(new DomDriver());

    xstream.processAnnotations(cls);

     @SuppressWarnings("unchecked")

  T t = (T) xstream.fromXML(xmlStr);

   return t;

   }

  2、根据节点的层级关系定义实体(此为重点)

    由顶级节点alipay建的实体Alipay 类(Alipay -response-trade) request暂时不需要解析可用String接收

省略get,set方法

  Alipay 的下级节点response建造类Response

  

省略get,set方法

    Response的下级节点trade建造类    

xml中所有的标签都要解析,否则会报错

3、调用

  String xml="...";  //xml字符串

  Alipay alipay = XStreamHandle.toBean(xml, Alipay.class);

  Trade trade = alipay.getResponse().getTrade();

二、样例二

  books中有好多book数,有价格,书名,作者

  xml样式:  

      <?xml version="1.0" encoding="utf-8"?>

      <books>
        <book price="108">
          <name>Java编程思想</name>
           <author>Bruce Eckel</author>
        </book>
        <book price="52">
          <name>Effective Java</name>
          <author>Joshua Bloch</author>
        </book>
        <book price="118">
          <name>Java 7入门经典</name>
          <author>Ivor Horton</author>
        </book>
      </books>

  1、工具类还用样例一中的工具类,这里不做重复了

  2、根据节点的层级关系定义实体

    根据顶级元素books创建实体

    

  根据子级创建book类

 3、调用

    String xmlString = "......";   //xml内容

    Books books = XStreamHandle.toBean(xmlString, Books.class);
    List<Book> booklist = books.getList();
    System.out.println(booklist.size());

复杂的xml转化为java实体的更多相关文章

  1. json转化为java实体

    import net.sf.json.JSONObject; Map<String, Object> classMap = new HashMap<String, Object> ...

  2. 利用JAXB实现java实体类和xml互相转换

    1.应用场景 在使用WebService实现数据上传下载,数据查询时,可以利用JAXB实现java实体类和xml互相转换 2.Demo 2.1 student.java 实体类,包含list(set同 ...

  3. xml文档的解析并通过工具类实现java实体类的映射:XML工具-XmlUtil

    若有疑问,可以联系我本人微信:Y1141100952 声明:本文章为原稿,转载必须说明 本文章地址,否则一旦发现,必追究法律责任 1:本文章显示通过 XML工具-XmlUtil工具实现解析soap报文 ...

  4. xml转json和实体类的两种方式

    本文为博主原创,未经允许不得转载: xml在http通信中具有较高的安全性和传输速度,所以应用比较广泛, 在项目中往往需要对xml,json和实体类进行相互转换,在这里总结一下自己所用到的一些方法: ...

  5. 根据XML文件 生成 java类

    最近一直在做关于webservice 的项目,这种项目最麻烦的就是根据对方的要求产生XML,文档里面虽然有XML结构,但是要转化为java里面的实体实在费劲, 有个自动化的工具就好了,半自动化也好,省 ...

  6. WebService(2)-XML系列之Java和Xml之间相互转换

    源代码下载:链接:http://pan.baidu.com/s/1ntL1a7R password: rwp1 本文主要讲述:使用jaxb完毕对象和xml之间的转换 TestJava2xml.java ...

  7. XML概念定义以及如何定义xml文件编写约束条件java解析xml DTD XML Schema JAXP java xml解析 dom4j 解析 xpath dom sax

    本文主要涉及:xml概念描述,xml的约束文件,dtd,xsd文件的定义使用,如何在xml中引用xsd文件,如何使用java解析xml,解析xml方式dom sax,dom4j解析xml文件 XML来 ...

  8. org.xml.sax.SAXParseException;在实体引用中, 实体名称必须紧跟在 '&' 后面

    错误信息如下:org.xml.sax.SAXParseException;在实体引用中, 实体名称必须紧跟在 ‘’&’’ 后面 出现这个错误的原因是在xml中使用&,实际上xml中不支 ...

  9. JAXB轻松转换xml对象和java对象

    实体类如下: package com.cn.entity; import java.util.List; import javax.xml.bind.annotation.XmlAccessType; ...

随机推荐

  1. 在SqlServer2008R2中,在一张表上加上insert、update、delete触发器(带游标)

    在日常工作中,在SqlServer2008R2中,需要向一张表上加上触发器,监控插入.更新.删除. --一个触发器内三种INSERT,UPDATE,DELETE状态 IF exists(select ...

  2. TDR分辨率

    在日常的生活工作中,有很多测试测量的工具,比如测量长度的尺子,计量时间的钟表等等,谈到测试测量工具的时候,分辨率是关键指标之一,比如尺子的 分辨率是1mm,时钟的分辨率是秒.所谓分辨率就是测试测量工具 ...

  3. hibernate用注解替代映射文件

    1.首先把原来的映射文件删掉,给实体类添加注解: @Entity //声明当前类为hibernate映射到数据库中的实体类 @Table(name="news") //声明tabl ...

  4. PLSQL使用技巧

    PL/SQL Developer记住登陆密码    在使用PL/SQL Developer时,为了工作方便希望PL/SQL Developer记住登录Oracle的用户名和密码: 设置方法:PL/SQ ...

  5. 在Eclipse中对包进行增删改查

    package com.hanqi.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.R ...

  6. 进程管理三大扩展工具htop

    三大进程管理监控工具 HTOP 介绍: Htop是一款运行于Linux系统监控与进程管理软件,htop提供所有进程的列表,并且使用彩色标识出处理器.swap和内存状态.用户一般可以在top无法提供详尽 ...

  7. es6学习笔记一数组(中)

    接着上一篇,给大家再分享一些数组的其他方法.大家也可以去点击这里学习数组更多的方法 concat方法: 概述:    concat() 方法将传入的数组或非数组值与原数组合并,组成一个新的数组并返回. ...

  8. 【原创】机器学习之PageRank算法应用与C#实现(1)算法介绍

    考虑到知识的复杂性,连续性,将本算法及应用分为3篇文章,请关注,将在本月逐步发表. 1.机器学习之PageRank算法应用与C#实现(1)算法介绍 2.机器学习之PageRank算法应用与C#实现(2 ...

  9. iOS开发之窥探UICollectionViewController(一) -- Ready Your CollectionViewController

    之前用CollectionViewController只是皮毛,一些iOS从入门到精通的书上也是泛泛而谈.这几天好好的搞了搞苹果的开发文档上CollectionViewController的内容,亲身 ...

  10. Android随笔之——Android ADB详解

    ADB全称Android Debug Bridge, 是android sdk里的一个工具, 用这个工具可以直接操作管理android模拟器或者真实的andriod设备.它主要有以下几个功能: 1.运 ...