JABX生成与解析XML工具类

package com.wisetv.spark.dataautocontroller.util;

import java.io.StringReader;
import java.io.StringWriter;
import java.util.Collection;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.namespace.QName;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.Validate;


/**
 * 使用Jaxb2.0实现XML<->Java Object的Mapper.
 * 在创建时需要设定所有需要序列化的Root对象的Class.
 * 特别支持Root对象是Collection的情形.
 */
public class JaxbUtil {
    private static ConcurrentMap<Class, JAXBContext> jaxbContexts = new ConcurrentHashMap<Class, JAXBContext>();

    /**
     * Java Object->Xml without encoding.
     */
    @SuppressWarnings("rawtypes")
    public static String toXml(Object root) throws JAXBException {
        Class clazz = getUserClass(root);
        return toXml(root, clazz, null);
    }

    /**
     * Java Object->Xml with encoding.
     */
    @SuppressWarnings("rawtypes")
    public static String toXml(Object root, String encoding) throws JAXBException {
        Class clazz = getUserClass(root);
        return toXml(root, clazz, encoding);
    }

    public static Class<?> getUserClass(Object root){
        return root.getClass();
    }

    /**
     * Java Object->Xml with encoding.
     */
    @SuppressWarnings("rawtypes")
    public static String toXml(Object root, Class clazz, String encoding) throws JAXBException {

        StringWriter writer = new StringWriter();
        createMarshaller(clazz, encoding).marshal(root, writer);
        return writer.toString();

    }

    /**
     * Java Collection->Xml without encoding, 特别支持Root Element是Collection的情形.
     */
    @SuppressWarnings("rawtypes")
    public static String toXml(Collection<?> root, String rootName, Class clazz) throws JAXBException {
        return toXml(root, rootName, clazz, null);
    }

    /**
     * Java Collection->Xml with encoding, 特别支持Root Element是Collection的情形.
     */
    @SuppressWarnings("rawtypes")
    public static String toXml(Collection<?> root, String rootName, Class clazz, String encoding) throws JAXBException {

        CollectionWrapper wrapper = new CollectionWrapper();
        wrapper.collection = root;

        JAXBElement<CollectionWrapper> wrapperElement = new JAXBElement<CollectionWrapper>(new QName(rootName),
                CollectionWrapper.class, wrapper);

        StringWriter writer = new StringWriter();
        createMarshaller(clazz, encoding).marshal(wrapperElement, writer);

        return writer.toString();

    }

    /**
     * Xml->Java Object.
     */
    @SuppressWarnings("unchecked")
    public static <T> T fromXml(String xml, Class<T> clazz) {
        try {
            StringReader reader = new StringReader(xml);
            return (T) createUnmarshaller(clazz).unmarshal(reader);
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 创建Marshaller并设定encoding(可为null).
     * 线程不安全,需要每次创建或pooling。
     */
    @SuppressWarnings("rawtypes")
    public static Marshaller createMarshaller(Class clazz, String encoding) throws JAXBException {

        JAXBContext jaxbContext = getJaxbContext(clazz);

        Marshaller marshaller = jaxbContext.createMarshaller();

        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

        if (StringUtils.isNotBlank(encoding)) {
            marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
        }
        return marshaller;

    }

    /**
     * 创建UnMarshaller.
     * 线程不安全,需要每次创建或pooling。
     */
    @SuppressWarnings("rawtypes")
    public static Unmarshaller createUnmarshaller(Class clazz) {
        try {
            JAXBContext jaxbContext = getJaxbContext(clazz);
            return jaxbContext.createUnmarshaller();
        } catch (JAXBException e) {
            e.printStackTrace();
        }

        return null;
    }

    @SuppressWarnings("rawtypes")
    protected static JAXBContext getJaxbContext(Class clazz) {
        Validate.notNull(clazz, "'clazz' must not be null");
        JAXBContext jaxbContext = jaxbContexts.get(clazz);
        if (jaxbContext == null) {
            try {
                jaxbContext = JAXBContext.newInstance(clazz, CollectionWrapper.class);
                jaxbContexts.putIfAbsent(clazz, jaxbContext);
            } catch (JAXBException ex) {
                throw new RuntimeException("Could not instantiate JAXBContext for class [" + clazz + "]: "
                        + ex.getMessage(), ex);
            }
        }
        return jaxbContext;
    }

    /**
     * 封装Root Element 是 Collection的情况.
     */
    public static class CollectionWrapper {

        @XmlAnyElement
        protected Collection<?> collection;
    }

    public static void main(String[] args) {
        Object a = (Object)new String();
        Class<?> aClass = a.getClass();
        System.out.println(aClass.getName());
    }
}

演示

package com.wisetv.spark.test;

import com.wisetv.spark.dataautocontroller.bean.DataAutoAnalysisBean;
import com.wisetv.spark.dataautocontroller.bean.FieldsBean;
import com.wisetv.spark.dataautocontroller.bean.ProcessDataBean;
import com.wisetv.spark.dataautocontroller.bean.RecordBean;
import com.wisetv.spark.dataautocontroller.util.JaxbUtil;

import javax.xml.bind.JAXBException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class DataJobGenerate {

    public static void main(String[] args) {
        DataAutoAnalysisBean bean = new DataAutoAnalysisBean();
        bean.setFieldParser("iptv_parser");
        ProcessDataBean processDataBean = new ProcessDataBean();
        List<FieldsBean> fieldsBeanList = new ArrayList<>();
        FieldsBean fieldsBean1 = new FieldsBean();
        fieldsBean1.setFieldname("userid");
        fieldsBean1.setValue("userid");
        fieldsBeanList.add(fieldsBean1);
        FieldsBean fieldsBean2 = new FieldsBean();
        fieldsBean2.setFieldname("channelid");
        fieldsBean2.setValue("channelid");
        fieldsBeanList.add(fieldsBean2);
        FieldsBean fieldsBean3 = new FieldsBean();
        fieldsBean3.setFieldname("starttime");
        fieldsBean3.setValue("DateFromat('pre_time','yyyyMMddHHmmss','yyyyMMddHHmmss')");
        fieldsBeanList.add(fieldsBean3);
        FieldsBean fieldsBean4 = new FieldsBean();
        fieldsBean4.setFieldname("endtime");
        fieldsBean4.setValue("DateFromat('cur_time','yyyyMMddHHmmss','yyyyMMddHHmmss')");
        fieldsBeanList.add(fieldsBean4);
        processDataBean.setFieldList(fieldsBeanList);
        processDataBean.setType("3");
        processDataBean.setOutputPath("E:\\model\\aaa");
        processDataBean.setAbstractDisFunctionName("DefaultDisPatch");
        processDataBean.setDataDispatchProcessName("DataDispatchProcess");

        List<ProcessDataBean> processDataBeanList = new ArrayList<>();
        processDataBeanList.add(processDataBean);
        bean.setProcessDataList(processDataBeanList);


        List<RecordBean> recordBeanList = new ArrayList<>();
        RecordBean recordBean1 = new RecordBean();
        recordBean1.setProcessName("LogPreProcessMax");
        recordBean1.setInputfile("e:/MapInfo.2019-04-20.log");
        recordBean1.setKeys("userid,stbtype");
        recordBean1.setResultName("LogPreProcessMax");
        recordBeanList.add(recordBean1);

        RecordBean recordBean2 = new RecordBean();
        recordBean2.setProcessName("LogPreProcessMin");
        recordBean2.setInputfile("e:/MapInfo.2019-04-20.log");
        recordBean2.setKeys("userid,stbtype");
        recordBean2.setResultName("LogPreProcessMin");
        recordBeanList.add(recordBean2);

        RecordBean recordBean3 = new RecordBean();
        recordBean3.setProcessName("LogPreProcessGroup");
        recordBean3.setInputfile("e:/MapInfo.2019-04-20.log");
        recordBean3.setKeys("userid,stbtype");
        recordBean3.setResultName("LogPreProcessGroup");
        List<String> inputList = new ArrayList<>();
        inputList.add("LogPreProcessMax");
        inputList.add("LogPreProcessMin");
        recordBean3.setInputList(inputList);
        recordBeanList.add(recordBean3);
        inputList.clear();

        RecordBean recordBean4 = new RecordBean();
        recordBean4.setProcessName("LogPreProcessSort");
        recordBean4.setKeys("userid,stbtype");
        recordBean4.setResultName("LogPreProcessSort");

        inputList.add("LogPreProcessGroup");
        recordBeanList.add(recordBean4);
        inputList.clear();

        RecordBean recordBean5 = new RecordBean();
        recordBean5.setProcessName("LogPreProcessETL");
        recordBean5.setFunctionName("FilterChannelstatus");
        recordBean5.setAbstractFunctionType("AbstractETLFunction");
        recordBean5.setResultName("LogPreProcessETL");
        inputList.add("LogPreProcessSort");
        recordBeanList.add(recordBean5);

        RecordBean recordBean6 = new RecordBean();
        recordBean6.setProcessName("LogDataFormatProcess");
        recordBean6.setFunctionName("DefaultFormat");
        recordBean6.setAbstractFunctionType("AbstractFormatFunction");
        recordBean6.setResultName("LogDataFormatProcess");
        inputList.add("LogPreProcessSort");
        recordBeanList.add(recordBean6);


        bean.setRecordBeanList(recordBeanList);



        String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" +
                "<dataAutoAnalysis>\n" +
                "    <process_data>\n" +
                "        <fields>\n" +
                "            <fieldname>userid</fieldname>\n" +
                "            <value>userid</value>\n" +
                "        </fields>\n" +
                "        <fields>\n" +
                "            <fieldname>channelid</fieldname>\n" +
                "            <value>channelid</value>\n" +
                "        </fields>\n" +
                "        <fields>\n" +
                "            <fieldname>starttime</fieldname>\n" +
                "            <value>DateFromat('pre_time','yyyyMMddHHmmss','yyyyMMddHHmmss')</value>\n" +
                "        </fields>\n" +
                "        <fields>\n" +
                "            <fieldname>endtime</fieldname>\n" +
                "            <value>DateFromat('cur_time','yyyyMMddHHmmss','yyyyMMddHHmmss')</value>\n" +
                "        </fields>\n" +
                "        <type>3</type>\n" +
                "        <outputPath>E:\\model\\aaa</outputPath>\n" +
                "        <datadispatchprocessname>DataDispatchProcess</datadispatchprocessname>\n" +
                "        <abstractdisfunctionname>DefaultDisPatch</abstractdisfunctionname>\n" +
                "    </process_data>\n" +
                "    <v_record>\n" +
                "        <processname>LogPreProcessMax</processname>\n" +
                "        <keys>userid,stbtype</keys>\n" +
                "        <inputfile>e:/MapInfo.2019-04-20.log</inputfile>\n" +
                "        <resultname>LogPreProcessMax</resultname>\n" +
                "    </v_record>\n" +
                "    <v_record>\n" +
                "        <processname>LogPreProcessMin</processname>\n" +
                "        <keys>userid,stbtype</keys>\n" +
                "        <inputfile>e:/MapInfo.2019-04-20.log</inputfile>\n" +
                "        <resultname>LogPreProcessMin</resultname>\n" +
                "    </v_record>\n" +
                "    <v_record>\n" +
                "        <processname>LogPreProcessGroup</processname>\n" +
                "        <keys>userid,stbtype</keys>\n" +
                "        <inputfile>e:/MapInfo.2019-04-20.log</inputfile>\n" +
                "        <inputlist>LogPreProcessSort</inputlist>\n" +
                "        <inputlist>LogPreProcessSort</inputlist>\n" +
                "        <resultname>LogPreProcessGroup</resultname>\n" +
                "    </v_record>\n" +
                "    <v_record>\n" +
                "        <processname>LogPreProcessSort</processname>\n" +
                "        <keys>userid,stbtype</keys>\n" +
                "        <resultname>LogPreProcessSort</resultname>\n" +
                "    </v_record>\n" +
                "    <v_record>\n" +
                "        <processname>LogPreProcessETL</processname>\n" +
                "        <functionname>FilterChannelstatus</functionname>\n" +
                "        <abstractfunctiontype>AbstractETLFunction</abstractfunctiontype>\n" +
                "        <resultname>LogPreProcessETL</resultname>\n" +
                "    </v_record>\n" +
                "    <v_record>\n" +
                "        <processname>LogDataFormatProcess</processname>\n" +
                "        <functionname>DefaultFormat</functionname>\n" +
                "        <abstractfunctiontype>AbstractFormatFunction</abstractfunctiontype>\n" +
                "        <resultname>LogDataFormatProcess</resultname>\n" +
                "    </v_record>\n" +
                "</dataAutoAnalysis>";

        DataAutoAnalysisBean bean1 = JaxbUtil.fromXml(xml, DataAutoAnalysisBean.class);
        System.out.println(bean1);
//        try {
//            System.out.println(JaxbUtil.toXml(bean));
//        } catch (JAXBException e) {
//            e.printStackTrace();
//        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值