xstream--xml工具类--java对象转换JSONObject、xml与java对象互转

工作环境: myeclipse2013、jdk1.8、fastjson1.1.41、xstream1.4.3


import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.Writer;
import java.lang.reflect.Field;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import com.alibaba.fastjson.JSONObject;
import com.loe.vo.XStreamCDATA;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.core.util.QuickWriter;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.io.json.JsonHierarchicalStreamDriver;
import com.thoughtworks.xstream.io.json.JsonWriter;
import com.thoughtworks.xstream.io.xml.DomDriver;
import com.thoughtworks.xstream.io.xml.PrettyPrintWriter;
import com.thoughtworks.xstream.io.xml.XmlFriendlyNameCoder;
import com.thoughtworks.xstream.io.xml.XppDriver;

public class XmlUtil {

    public static Log logger = LogFactory.getLog(XmlUtil.class);

    /**
     * 读取xml标签内容
     * 
     * @param xmlStr
     * @param tagName
     * @return
     * @throws Exception
     */
    public static String readXMLString4TagName(String xmlStr, String tagName)
            throws Exception {

        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

        DocumentBuilder builder = dbf.newDocumentBuilder();

        InputStream inputStream = new ByteArrayInputStream(xmlStr.getBytes());

        Document doc = builder.parse(inputStream); //

        // 下面开始读取

        Element root = doc.getDocumentElement(); // 获取根元素

        NodeList nodes = root.getElementsByTagName(tagName);
        Element e = (Element) nodes.item(0);

        Node t = e.getFirstChild();

        return t.getNodeValue();
    }

    /**
     * xmlString 转换成对象
     * 
     * @param xml
     * @param obj
     * @return
     */
    public static Object xmlToObj(String xml, Object obj) {
        XStream xstream = new XStream();
        xstream.autodetectAnnotations(true);
        obj = xstream.fromXML(xml, obj);
        return obj;
    }

    /**
     * 对象转换成XMLString
     * 
     * @param alias
     * @param obj
     * @return
     */
    public static String objToXmlStr(String alias, Object obj) {
        XStream xstream = createXstream();
        xstream.autodetectAnnotations(true);
        xstream.alias(alias, obj.getClass());
        String xml = xstream.toXML(obj);
        return xml;
    }

    /**
     * xmlString转换成对象
     * @param alias
     * @param xml
     * @param obj
     * @return
     */
    public static Object xmlToObj(String alias, String xml, Object obj) {
        XStream xstream = new XStream(new DomDriver());
        xstream.alias(alias, obj.getClass());
        xstream.processAnnotations(obj.getClass());
        obj = xstream.fromXML(xml, obj);
        return obj;
    }

    public static XStream createXstream() {
        return new XStream(new XppDriver() {

            @Override
            public HierarchicalStreamWriter createWriter(Writer out) {
                // 标签名带下划线
                XmlFriendlyNameCoder nameCode = new XmlFriendlyNameCoder("_-",
                        "_");
                return new PrettyPrintWriter(out, nameCode) {
                    boolean cdata = false;
                    Class<?> targetClass = null;

                    @Override
                    public void startNode(String name,
                            @SuppressWarnings("rawtypes") Class clazz) {
                        super.startNode(name, clazz);
                        // 业务处理,对于用XStreamCDATA标记的Field,需要加上CDATA标签
                        if (!name.equals("xml")) {
                            cdata = needCDATA(targetClass, name);
                        } else {
                            targetClass = clazz;
                        }
                    }

                    protected void writeText(QuickWriter writer, String text) {
                        if (cdata) {
                            writer.write(cDATA(text));
                        } else {
                            writer.write(text);
                        }
                    }
                };
            }
        });
    }

    private static boolean needCDATA(Class<?> targetClass, String fieldAlias) {
        boolean cdata = false;
        // first, scan self
        cdata = existsCDATA(targetClass, fieldAlias);
        if (cdata)
            return cdata;
        // if cdata is false, scan supperClass until java.lang.Object
        Class<?> superClass = targetClass.getSuperclass();
        while (!superClass.equals(Object.class)) {
            cdata = existsCDATA(superClass, fieldAlias);
            if (cdata)
                return cdata;
            superClass = superClass.getClass().getSuperclass();
        }
        return false;
    }

    private static boolean existsCDATA(Class<?> clazz, String fieldAlias) {
        // scan fields
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            // 1. exists XStreamCDATA
            if (field.getAnnotation(XStreamCDATA.class) != null) {
                XStreamAlias xStreamAlias = field
                        .getAnnotation(XStreamAlias.class);
                // 2. exists XStreamAlias
                if (null != xStreamAlias) {
                    String xStreamAliasvalue = xStreamAlias.value();
                    if (fieldAlias.equalsIgnoreCase(xStreamAliasvalue)) {
                        return true;
                    }

                } else {
                    // not exists XStreamAlias
                    if (fieldAlias.equals(field.getName()))
                        return true;
                }
            }
        }
        return false;
    }

    private static String cDATA(String text) {
        StringBuffer str = new StringBuffer();
        str.append("<![CDATA[");
        str.append(text);
        str.append("]]>");
        return str.toString();
    }

    /**
     * 对象转换成json
     * @param object
     * @return
     */
    public static JSONObject objToJSONStr(Object object){
        XStream xstream = new XStream(new JsonHierarchicalStreamDriver(){
            public HierarchicalStreamWriter createWriter(Writer writer){
                return new JsonWriter(writer, JsonWriter.DROP_ROOT_MODE);
            }
        });
        xstream.processAnnotations(object.getClass());
        return JSONObject.parseObject(xstream.toXML(object));
    }

}

XStreamCDATA.class

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
@Documented 
@Inherited
public @interface XStreamCDATA {

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值