xml转换方式记载

一、背景

最近接接口,然后了,返回的接口有两种格式,一种是xml的,一种是json格式的,所以我首选是接收json格式的,但是json格式的数据有一个弊端,那就是字段名称全是简写的。但是xml的名称都是见名知意的,两种方式都尝试了下,最后还是选择xml的格式。

二、转换方式

xml格式的直接转对象,也有好多选择,我这边使用了两种方式,其一是XStream,另外一种是jaxb;现在分别数说说了!!!
(1)Xtream

<?xml version="1.0" encoding="utf-8"?>
<result> 
  <errorCode>success</errorCode>  
  <errorMsg>成功</errorMsg>  
  <orders> 
    <order> 
      <booker>是我的</booker>  
      <checkInDate>2016-12-26</checkInDate>  
      <checkOutDate>2016-12-27</checkOutDate>  
      <guest>是我的</guest>  
      <hotelName>深圳南澳520度假主题客栈</hotelName>  
      <orderNo>HT16122601101</orderNo>  
      <orderStatus>1</orderStatus>  
      <orderStatusName>fasfsa</orderStatusName>  
      <orderTime>2016-12-26 16:19:35.0</orderTime>  
    </order>  
    <order> 
      <booker>就是我的</booker>  
      <checkInDate>2016-09-06</checkInDate>  
      <checkOutDate>2016-09-07</checkOutDate>  
      <guest>就是我的</guest>  
      <hotelName>深圳南澳520度假主题客栈</hotelName>  
      <orderNo>HT16090600362</orderNo>  
      <orderStatus>1</orderStatus>  
      <orderStatusName>dfas</orderStatusName>  
      <orderTime>2016-09-06 14:06:15.0</orderTime>  
    </order>  
  </orders>  
</result>

需要转换的xml字符串
转换代码,result就是上面的字符串

String result = HttpClient.order("getOrderList", orderParam);
XStream xstream = new XStream(); 
xstream.alias("result", ResultBean.class); 
xstream.alias("order", Order.class); 
orderInfo = (ResultBean) xstream.fromXML(result);

给出ResultBean对象和Order对象数据

package com.mouse.moon.xml;
import java.util.List;
public class ResultBean {
    private String errorCode;
    private String errorMsg;
    private  List<Order> orders;
    public String getErrorCode() {
        return errorCode;
    }

    public void setErrorCode(String errorCode) {
        this.errorCode = errorCode;
    }

    public String getErrorMsg() {
        return errorMsg;
    }

    public void setErrorMsg(String errorMsg) {
        this.errorMsg = errorMsg;
    }

    public List<Order> getOrders() {
        return orders;
    }

    public void setOrders(List<Order> orders) {
        this.orders = orders;
    }
}   

package com.mouse.moon.xml;
public class Order {
    private String booker;
    private String checkInDate;
    private String checkOutDate;
    private String guest;
    private String hotelName;
    private String orderNo;
    private String orderStatus;
    private String orderStatusName;
    private String orderTime;
    public String getBooker() {
        return booker;
    }
    public void setBooker(String booker) {
        this.booker = booker;
    }
    public String getCheckInDate() {
        return checkInDate;
    }
    public void setCheckInDate(String checkInDate) {
        this.checkInDate = checkInDate;
    }
    public String getCheckOutDate() {
        return checkOutDate;
    }
    public void setCheckOutDate(String checkOutDate) {
        this.checkOutDate = checkOutDate;
    }
    public String getGuest() {
        return guest;
    }
    public void setGuest(String guest) {
        this.guest = guest;
    }
    public String getHotelName() {
        return hotelName;
    }
    public void setHotelName(String hotelName) {
        this.hotelName = hotelName;
    }
    public String getOrderNo() {
        return orderNo;
    }
    public void setOrderNo(String orderNo) {
        this.orderNo = orderNo;
    }
    public String getOrderStatus() {
        return orderStatus;
    }
    public void setOrderStatus(String orderStatus) {
        this.orderStatus = orderStatus;
    }
    public String getOrderStatusName() {
        return orderStatusName;
    }
    public void setOrderStatusName(String orderStatusName) {
        this.orderStatusName = orderStatusName;
    }
    public String getOrderTime() {
        return orderTime;
    }
    public void setOrderTime(String orderTime) {
        this.orderTime = orderTime;
    }
}

所以如上述转换代码所示,需要将你的对象与xml的节点数据对应上

xstream.alias("result", ResultBean.class); 

另外说一点,比如有的数据节点上还有数据

<?xml version="1.0" encoding="utf-8"?>
<result> 
 <errorCode>success</errorCode>  
 <errorMsg>成功</errorMsg>  
 <orders> 
   <order booerId="123"> 
      我得
   </order>  
 </orders>  
</result>

比如在order节点上还有一个预订人的id,那么在order类就需要做修改
就需要在Order如下

@XStreamConverter(value=ToAttributedValueConverter.class, strings={"booker"}) 
public class Order {
    private String booker;
    @XStreamAsAttribute
    private String booerId;
    public String getBooker() {
        return booker;
    }
    public void setBooker(String booker) {
        this.booker = booker;
    }
    public String getBooerId() {
        return booerId;
    }
    public void setBooerId(String booerId) {
        this.booerId = booerId;
    }
}

(2)JAXB

String result = HttpClient.order("getOrderList", orderParam);
StringReader read = new StringReader(result);
InputSource source = new InputSource(read);
JAXBContext jaxbContext = JAXBContext.newInstance(ResultBean .class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
ResultBean resultBean= (ResultBean ) jaxbUnmarshaller.unmarshal(source);

类中需要做注解配置

package com.mouse.moon.xml;
import java.util.List;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlRootElement(name="result")
@XmlType(propOrder = { "errorCode","errorMsg", "orders"})
public class ResultBean {
    private String errorCode;
    private String errorMsg;
    private  List<Order> orders;
    public String getErrorCode() {
        return errorCode;
    }
    @XmlElement
    public void setErrorCode(String errorCode) {
        this.errorCode = errorCode;
    }
    public String getErrorMsg() {
        return errorMsg;
    }
    @XmlElement
    public void setErrorMsg(String errorMsg) {
        this.errorMsg = errorMsg;
    }
    public List<Order> getOrders() {
        return orders;
    }
    @XmlElement
    public void setOrders(List<Order> orders) {
        this.orders = orders;
    }
}       
package com.mouse.moon.xml;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Order {
    private String booker;
    private String checkInDate;
    private String checkOutDate;
    private String guest;
    private String hotelName;
    private String orderNo;
    private String orderStatus;
    private String orderStatusName;
    private String orderTime;
    public String getBooker() {
        return booker;
    }
    public void setBooker(String booker) {
        this.booker = booker;
    }
    public String getCheckInDate() {
        return checkInDate;
    }
    public void setCheckInDate(String checkInDate) {
        this.checkInDate = checkInDate;
    }
    public String getCheckOutDate() {
        return checkOutDate;
    }
    public void setCheckOutDate(String checkOutDate) {
        this.checkOutDate = checkOutDate;
    }
    public String getGuest() {
        return guest;
    }
    public void setGuest(String guest) {
        this.guest = guest;
    }
    public String getHotelName() {
        return hotelName;
    }
    public void setHotelName(String hotelName) {
        this.hotelName = hotelName;
    }
    public String getOrderNo() {
        return orderNo;
    }
    public void setOrderNo(String orderNo) {
        this.orderNo = orderNo;
    }
    public String getOrderStatus() {
        return orderStatus;
    }
    public void setOrderStatus(String orderStatus) {
        this.orderStatus = orderStatus;
    }
    public String getOrderStatusName() {
        return orderStatusName;
    }
    public void setOrderStatusName(String orderStatusName) {
        this.orderStatusName = orderStatusName;
    }
    public String getOrderTime() {
        return orderTime;
    }
    public void setOrderTime(String orderTime) {
        this.orderTime = orderTime;
    }
}

这个其实在网上也是有资料的https://www.javacodegeeks.com/2013/02/jaxb-tutorial-getting-started.html
注意在一级中的每个set属性上都要加上 @XmlElement,且不要再get方法上加,否则转换报错
使用jaxb将对象转换为xml的方式如下

      StringWriter writer = new StringWriter();
        try {
            JAXBContext jaxbContext = JAXBContext.newInstance(bean.getClass());
            Marshaller marshaller = jaxbContext.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
            marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
            marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
            marshaller.marshal(bean, writer);
        } catch (JAXBException e) {
            e.printStackTrace();
        } finally {
            try {
                writer.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return writer.getBuffer().toString();

浩语

                                          __                                                        
                            __  _  ____ __|  |__ _____    ___
                            \ \/ \/ /  |  \  |  \\__  \  /  _ \   
                             \     /|  |  /   Y  \/ __ \(  <_> )
                              \/\_/ |____/|___|  (____  /\____/ 
                                                    \/     \/          
          走在自己的路上,遇到要遇到的人,经历要经历的事,这才是我们需要面对的。
                                                       
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容