java对象转换为xml格式字符串

断了今生、忘了曾经 提交于 2019-12-06 22:14:52

java类:javax.xml.bind.JAXBContext

它提供了管理实现 JAXB 绑定框架操作所需的 XML/Java 绑定信息的抽象,这些操作包括:解组、编组和验证。

1.编写工具类

/**
 * Jaxb工具类
 *
 * @author LittleNewbie
 * @date 2016年10月11日
 */
public class JaxbUtil {

    public static final String DEFAULT_ENCODING = "UTF-8";

    /**
     * pojo转换成xml 默认编码UTF-8
     *
     * @param obj 待转化的对象
     * @return xml格式字符串
     * @throws Exception JAXBException
     */
    public static String convertToXml(Object obj) throws Exception {
        return convertToXml(obj, DEFAULT_ENCODING);
    }

    /**
     * pojo转换成xml
     *
     * @param obj 待转化的对象
     * @param encoding 编码
     * @return xml格式字符串
     * @throws Exception JAXBException
     */
    public static String convertToXml(Object obj, String encoding) throws Exception {
        String result = null;

        JAXBContext context = JAXBContext.newInstance(obj.getClass());
        Marshaller marshaller = context.createMarshaller();
        // 指定是否使用换行和缩排对已编组 XML 数据进行格式化的属性名称。
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);

        StringWriter writer = new StringWriter();
        marshaller.marshal(obj, writer);
        result = writer.toString();

        return result;
    }

    /**
     * xml转换成JavaBean
     *
     * @param xml xml格式字符串
     * @param t 待转化的对象
     * @return 转化后的对象
     * @throws Exception JAXBException
     */
    @SuppressWarnings("unchecked")
    public static <T> T convertToJavaBean(String xml, Class<T> t) throws Exception {
        T obj = null;
        JAXBContext context = JAXBContext.newInstance(t);
        Unmarshaller unmarshaller = context.createUnmarshaller();
        obj = (T) unmarshaller.unmarshal(new StringReader(xml));
        return obj;
    }
}

2.为pojo简单java对象添加注解

2.1 xml顶级元素

/**
 * 请求报文基础类
 * 请求报文的实现方式:
 * 1.使用默认的顶级标签元素<Request><Request/>:直接创建该类对象;
 * 2.使用其他顶级标签元素:继承该类,并添加注解@XmlRootElement(name = "rootName") rootName区分大小写
 *
 * @author LittleNewbie
 * @date 2016年10月11日
 */
//类中的每个非静态、非瞬态字段将会自动绑定到 XML,除非由 XmlTransient 注释
@XmlAccessorType(XmlAccessType.FIELD)
//xml顶级元素标签
@XmlRootElement(name = "Request")
public class RequestPacket {

    /**
     * 请求包体消息    
    */
    private MsgBody msgBody;

    public RequestPacket() {
    }

    //getter setter...
}

2.2 xml顶级元素,继承2.1

/**
 * 数据请求报文-根节点 
 * @author LittleNewbie
 * @date 2016年10月11日
 *
 */
@XmlRootElement(name = "DATARequest")
public class DataRequestPacket extends RequestPacket {

    public DataRequestPacket() {
    }
}

2.3 xml元素标签,包含其他元素标签 

/**
 * 请求包体消息
 * @author LittleNewbie
 * @date 2016年10月11日
 *
 */
@XmlAccessorType(XmlAccessType.FIELD)
public class MsgBody {

	@XmlElementWrapper(name = "CONDITIONLIST")
	@XmlElement(name = "CONDITION")
	private List<String> conditionList;

	/**
	 * 如果不添加XmlElement注解,默认以属性名生成xml元素标签
	 */
	@XmlElement(name = "DATALIST")
	private String dataList;

	
	private String config;
	

	public MsgBody() {
	}

	//getter setter...
}

 

3.测试代码及运行结果

测试代码

                RequestPacket root = new DataRequestPacket();

		MsgBody body = new MsgBody();

		String[] conditions = { "condition_1", "condition_2" };
		body.setConditionList(Arrays.asList(conditions));
		body.setDataList("");
                //这里不设置config值,属性值为null,将不会转为xml标签
                //body.setConfig("");

		root.setMsgBody(body);
		String xmlStr = JaxbUtil.convertToXml(root);
		System.out.println(xmlStr);

 

结果

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- 顶级元素为DataRequestPacket的@XmlRootElement注解值 -->
<DATARequest>
    <!-- 默认为属性(字段)名 -->
    <msgBody>
        <!-- 这里对照pojo一看就懂了 -->
        <CONDITIONLIST>
            <CONDITION>condition_1</CONDITION>
            <CONDITION>condition_2</CONDITION>
        </CONDITIONLIST>
        <!-- @XmlElement注解 -->
        <DATALIST></DATALIST>
        <!-- config值为null,不对其进行转换 -->
    </msgBody>
</DATARequest>

4.附加操作

4.1 过滤 standalone="yes"

xmlStr.replaceFirst(" standalone=\"yes\"", "")

4.2 将xml元素标签转为大写

String regex = "<(/*[A-Za-z]+)>";
Matcher matcher = Pattern.compile(regex).matcher(xmlStr);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
	matcher.appendReplacement(sb, "<" + matcher.group(1).toUpperCase() + ">");

}
matcher.appendTail(sb);
sb.toString();

4.3 获取xml元素标签内容

4.3.1 xml元素标签唯一

/**
     * 获取xml字符串中元素标签值
     * <p>xml中元素标签唯一</p>
     *
     * @param responseXml 响应报文(xml字符串格式)
     * @param element     元素名(不区分大小写)
     * @return
     * @throws Exception
     */
    public static String getXmlSingleElementValue(String responseXml, String element) {
        //元素名大写<ELEMENT>(.*)<ELEMENT/>
        StringBuffer regex = new StringBuffer();
        regex.append("<").append(element.toUpperCase()).append(">");
        regex.append("(.*)");
        regex.append("</").append(element.toUpperCase()).append(">");

        String str = "";
        Matcher matcher = Pattern.compile(regex.toString()).matcher(responseXml);
        while (matcher.find()) {
            str = matcher.group(1);
        }
        return str;
    }

4.3.1 xml元素标签不唯一(存在多个)

   /**
     * 获取xml字符串中元素标签值
     * <p>xml存在多个该元素标签</p>
     * <p>exmple:<DATA></DATA></p>
     *
     * @param responseXml 响应报文(xml字符串格式)
     * @param element     元素名(不区分大小写)
     * @return
     * @throws Exception
     */
    public static List<String> getXmlListElementValue(String responseXml, String element) {
        List<String> list = new ArrayList<String>();
        //元素名大写<ELEMENT>([^</ELEMENT>]*)</ELEMENT>
        StringBuffer regex = new StringBuffer();
        regex.append("<").append(element.toUpperCase()).append(">");
        regex.append("([^</" + element.toUpperCase() + ">]*)");
        regex.append("</").append(element.toUpperCase()).append(">");
        Matcher matcher = Pattern.compile(regex.toString()).matcher(responseXml);
        while (matcher.find()) {
            list.add(matcher.group(1));
        }
        return list;
    }

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!