xml和对象的转换

xml和对象的转换

工具类

import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.Writer;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

import cn.hutool.core.util.XmlUtil;
import com.sun.xml.internal.bind.marshaller.CharacterEscapeHandler;

class XmlUtils extends XmlUtil {

    /**
     * xml字符串转为bean
     * @param xml xml字符串
     * @param clazz 需要转成的对象
     * @return
     */
    @SuppressWarnings("unchecked")
    public static <T> T parseBean(String xml, Class<T> clazz) {
        /*try {
            JAXBContext context = JAXBContext.newInstance(clazz);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            return (T) unmarshaller.unmarshal(new StringReader(xml));
        } catch (JAXBException e) {
            e.printStackTrace();
            return null;
        }*/
        StringReader reader = null;
        try {
            JAXBContext context = JAXBContext.newInstance(clazz);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            reader = new StringReader(xml);
            @SuppressWarnings("unchecked")
            T t = (T) unmarshaller.unmarshal(reader);
            return t;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                reader.close();
            }
        }
        return null;
    }
    /**
     * 将对象转为xml字符串
     * 编码为utf-8
     * 不格式化
     * 省略头部声明
     * @param obj 待转的对象
     * @return
     */
    public static String toStr(Object obj) {
        return toStr(obj, false, true);
    }
    /**
     * 将对象转为xml字符串
     * 编码为utf-8
     * @param obj 待转的对象
     * @param isFormat 是否格式化
     * @param isIgnoreHead 是否忽略头部
     * @return
     */
    public static String toStr(Object obj, boolean isFormat, boolean isIgnoreHead) {
        StringWriter writer = null;
        try {
            JAXBContext context = JAXBContext.newInstance(obj.getClass());
            Marshaller marshaller = context.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");// //编码格式
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, isFormat);// 是否格式化生成的xml串
            marshaller.setProperty(Marshaller.JAXB_FRAGMENT, isIgnoreHead);// 是否省略xm头声明信息

            // 不进行转义字符的处理
            marshaller.setProperty(CharacterEscapeHandler.class.getName(),
                    new CharacterEscapeHandler() {
                        @Override
                        public void escape(char[] ch, int start, int length,
                                           boolean isAttVal, Writer writer) throws IOException {
                            writer.write(ch, start, length);
                        }
                    });

            writer = new StringWriter();
            marshaller.marshal(obj, writer);
            return writer.toString();
        } catch (JAXBException e) {
            e.printStackTrace();
            return null;
        }finally {
            if (writer != null) {
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    /**
     * 将对象转为xml字符串
     * 编码为utf-8
     * 格式化
     * 省略头部声明
     * @param obj 待转的对象
     * @return
     */
    public static String toPrettyStr(Object obj) {
        return toStr(obj, true, true);
    }


    /**
     * 将对象转为xml字符串
     * 编码为 GBK
     * @param obj 待转的对象
     * @param isFormat 是否格式化
     * @param isIgnoreHead 是否忽略头部
     * @return
     */
    public static String toStrGF(Object obj, boolean isFormat, boolean isIgnoreHead) {
        StringWriter writer = null;
        try {
            JAXBContext context = JAXBContext.newInstance(obj.getClass());
            Marshaller marshaller = context.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_ENCODING, "GBK");// //编码格式
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, isFormat);// 是否格式化生成的xml串
            marshaller.setProperty(Marshaller.JAXB_FRAGMENT, isIgnoreHead);// 是否省略xm头声明信息
            // 不进行转义字符的处理
            marshaller.setProperty(CharacterEscapeHandler.class.getName(),
                    new CharacterEscapeHandler() {
                        @Override
                        public void escape(char[] ch, int start, int length,
                                           boolean isAttVal, Writer writer) throws IOException {
                            writer.write(ch, start, length);
                        }
                    });

            writer = new StringWriter();
            marshaller.marshal(obj, writer);
            return writer.toString();
        } catch (JAXBException e) {
            e.printStackTrace();
            return null;
        }finally {
            if (writer != null) {
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }


    /**
     * 对象转为xml文件
     *
     * @param obj
     * @param beanClass 对象的class
     * @return
     */
    public static String beanToXml(Object obj, Class<?> beanClass) {
        StringWriter writer = null;
        try {
            JAXBContext context = JAXBContext.newInstance(beanClass);
            Marshaller marshaller = context.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
            writer = new StringWriter();
            marshaller.marshal(obj, writer);
            return writer.toString();

        } catch (JAXBException e) {
            e.printStackTrace();
        } finally {
            if (writer != null) {
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }
}

bean对象

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import javax.xml.bind.annotation.XmlRootElement;

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@XmlRootElement(name="root")
public class TestRootVo {
    private TestHeadVo head;
    private TestBodyVo body;
}

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

import javax.xml.bind.annotation.XmlRootElement;

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@XmlRootElement(name="head")
public class TestHeadVo  {
    private String TRAN_TIME;
    private String SERVICE_CODE;
    private String SEQ_NO;
}

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

import javax.xml.bind.annotation.XmlRootElement;

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@XmlRootElement(name="body")
public class TestBodyVo {
    private String QUEUE_NO;
    private String COUNTER_NO;
    private String IS_RECALL;
    private String COUNTER_TYPE;
}

测试

@org.junit.Test
    public void test5(){
        String xmlStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
                "\t<root>\n" +
                "\t\t<head>\n" +
                "\t\t\t<SERVICE_CODE>***</SERVICE_CODE>\n" +
                "\t\t\t<SEQ_NO >1234567890000000000</SEQ_NO >\n" +
                "\t\t\t<TRAN_TIME >2017012012111111</TRAN_TIME >\n" +
                "\t\t</head>\n" +
                "\t\t<body>\n" +
                "\t\t\t<QUEUE_NO>CN0010321</QUEUE_NO>\n" +
                "\t\t\t<COUNTER_NO>1</COUNTER_NO>\n" +
                "\t\t\t<IS_RECALL>1</IS_RECALL>\n" +
                "\t\t\t<COUNTER_TYPE>1</COUNTER_TYPE>\n" +
                "\t\t</body>\n" +
                "\t</root>";
        TestRootVo testRootVo = XmlUtils.parseBean(xmlStr, TestRootVo.class);
        System.out.println(testRootVo);
        System.out.println(testRootVo.getBody());
        System.out.println(testRootVo.getHead());
        System.out.println(XmlUtils.toStr(testRootVo,true,false));
        System.out.println(XmlUtils.toStrGF(testRootVo,true,false));
    }

测试输出

TestRootVo(head=TestHeadVo(TRAN_TIME=20170120121332, SERVICE_CODE=T0501, SEQ_NO=1234567890000000000), body=TestBodyVo(QUEUE_NO=CN0010321, COUNTER_NO=1, IS_RECALL=1, COUNTER_TYPE=1))
TestBodyVo(QUEUE_NO=CN0010321, COUNTER_NO=1, IS_RECALL=1, COUNTER_TYPE=1)
TestHeadVo(TRAN_TIME=20170120121332, SERVICE_CODE=T0501, SEQ_NO=1234567890000000000)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
    <body>
        <COUNTER_NO>1</COUNTER_NO>
        <COUNTER_TYPE>1</COUNTER_TYPE>
        <IS_RECALL>1</IS_RECALL>
        <QUEUE_NO>CN0010321</QUEUE_NO>
    </body>
    <head>
        <SEQ_NO>1234567890000000000</SEQ_NO>
        <SERVICE_CODE>T0501</SERVICE_CODE>
        <TRAN_TIME>20170120121332</TRAN_TIME>
    </head>
</root>

<?xml version="1.0" encoding="GBK" standalone="yes"?>
<root>
    <body>
        <COUNTER_NO>1</COUNTER_NO>
        <COUNTER_TYPE>1</COUNTER_TYPE>
        <IS_RECALL>1</IS_RECALL>
        <QUEUE_NO>CN0010321</QUEUE_NO>
    </body>
    <head>
        <SEQ_NO>1234567890000000000</SEQ_NO>
        <SERVICE_CODE>T0501</SERVICE_CODE>
        <TRAN_TIME>20170120121332</TRAN_TIME>
    </head>
</root>

原文: https://blog.csdn.net/weixin_40691089/article/details/106529266

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值