xml 转 对象 对象转xml

2 篇文章 0 订阅

xml 转 对象 对象转xml

今天在和外部对接接口时,需要用到 xml 格式的请求参数。刚下手时突然感觉有点手生,这次特地记录一下。
直接上互转代码

import com.alibaba.fastjson.JSON;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;

public class XmlParseUtils {
	/**
	 * bean转化成xml 
	 * @param obj
	 * @param load
	 * @return
	 * @throws JAXBException
	 */
	public static String beanToXml(Object obj, Class<?> load)  {
		JAXBContext context;
		try {
			context = JAXBContext.newInstance(load);
			Marshaller marshaller = context.createMarshaller();
			marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); // 是否格式化生成的xml串
			marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8"); //编码格式
			marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);// 是否省略xm头声明信息
			StringWriter writer = new StringWriter();
			marshaller.marshal(obj, writer);
			return writer.toString();
		} catch (JAXBException e) {
			e.printStackTrace();
			throw new IllegalArgumentException("xmlContext:"+ JSON.toJSONString(obj) +",class:"+load.getName(),e);
		}
		
	}

	/**
	 * xml转化成bean
	 * @param load
	 * @return
	 * @throws JAXBException
	 * @throws IOException
	 */
	public static <T> T xmlToBean(String xmlContext, Class<T> load) {
		try {
			JAXBContext context = JAXBContext.newInstance(load);
			Unmarshaller unmarshaller = context.createUnmarshaller();
			StringReader sr = new StringReader(xmlContext);
			Object  object = unmarshaller.unmarshal(sr);
			return (T) object;
		} catch (JAXBException e) {
			throw new IllegalArgumentException("xmlContext:"+xmlContext +",class:"+load.getName(),e);
		}
	}
}

转化的代码还是很简单的。但接下来问题来了,对面要求,对象的首字母大写其余的小写,参数的字母都要大写。可这明显不符合命名规范。于是只能强行命名。
这是便要用到xml的注解了。
如下面的对象

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "Person")
public class Person {
    private String name;
    private String style;

    private Family family;

    @XmlAttribute(name = "NAME")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    @XmlAttribute(name = "STYLE")
    public String getStyle() {
        return style;
    }

    public void setStyle(String style) {
        this.style = style;
    }

    @XmlElement(name = "Family")
    public Family getFamily() {
        return family;
    }

    public void setFamily(Family family) {
        this.family = family;
    }
}

下面分别来讲一下这些注解的作用
@XmlRootElement(name = ”Person”),这个是必须要的注解,里面的name 是为了解决刚提到的xml的首字母大写的问题。
@XmlAttribute(name = ”NAME”),是用来解决字段显示在同一个</>中的问题,name是为了解决刚提到的字段字母大写的问题。也可以使用@ XmlElement(name = ”NAME”),但两个注解的显示方式不一样。如使用@XmlAttribute 显示 如使用XmlElement(name = ”NAME”) 显示 张珊
@XmlElement(name = ”Family”), 是用来解决对象的xml的首字母大写的问题。

到此,对方的要求全部满足

如刚入门,建议看一下w3cschool JAXB 概述_w3cschool

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值