万能的java对象转xml算法

前言

之前找了好多java对象转xml的代码,有的需要加注解很啰嗦,有的遇到结构复杂的对象就报错;没办法,只好自己研究了……

说明

对象转xml的原理就在于分解对象的属性,如果遇到属性值是对象或数组,就继续分解,无限递归,直到搞完为止;

问题的关键在于,怎么才知道属性值是对象或数组,换算成json是一个不错的选择。

资源中包含了一个解析json的jar,如果你不喜欢这个jar,就换一个,总而言之,掌握原理是最棒的!!

资源链接

package com.code;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.commons.codec.CharEncoding;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

/**
 * xml的工具类
 * 
 * @version 1.0
 */
@SuppressWarnings({ "rawtypes", "unchecked" })
public final class XmlUtil {

    /**
     * 把对象转换成xml格式的字符串(递归)
     * 
     * @param object
     *            可以是实体类对象, Map
     * @param isHead
     *            是否带头部
     * @return String
     */
    public static String toXml(Object object, boolean isHead) {
        String result = (isHead ? "<?xml version=\"1.0\" encoding=\"" + CharEncoding.UTF_8 + "\" ?>" : "") + "<xml>\n";
        if (null != object) {
            result += toXml(object);
        }
        return result + "</xml>\n";
    }

    private static String toXml(Object object) {
        String result = "";
        JSONObject json = JSONObject.fromObject(object);
        Set set = json.keySet();
        for (Object key : set) {
            Object value = json.get(key);
            if (null == value) {
                result += "<" + key + "></" + key + ">\n";
            } else if (value instanceof JSONObject) {
                result += "<" + key + ">\n" + toXml(value) + "</" + key + ">\n";
            } else if (value instanceof JSONArray) {
                result += "<" + key + ">\n";
                JSONArray array = (JSONArray) value;
                for (Object obj : array) {
                    result += toXml(obj);
                }
                result += "</" + key + ">\n";
            } else {
                result += "<" + key + "><![CDATA[" + value + "]]></" + key + ">\n";
            }
        }
        return result;
    }

    public static void main(String[] args) {
        Map zhejiang = new HashMap();
        zhejiang.put("name", "浙江");
        Map hangzhou = new HashMap();
        hangzhou.put("name", "杭州");
        Map ningbo = new HashMap();
        ningbo.put("name", "宁波");
        Map fuyang = new HashMap();
        fuyang.put("name", "富阳");
        Map tonglu = new HashMap();
        tonglu.put("name", "桐庐");
        Map fenghua = new HashMap();
        fenghua.put("name", "奉化");
        Map cixi = new HashMap();
        cixi.put("name", "慈溪");
        List citys = new ArrayList();
        citys.add(hangzhou);
        citys.add(ningbo);
        zhejiang.put("child", citys);
        List county_hangzhou = new ArrayList();
        county_hangzhou.add(fuyang);
        county_hangzhou.add(tonglu);
        hangzhou.put("child", county_hangzhou);
        List county_ningbo = new ArrayList();
        county_ningbo.add(fenghua);
        county_ningbo.add(cixi);
        ningbo.put("child", county_ningbo);
        System.out.println(toXml(zhejiang, false));
    }

}
运行后得到结果:

<xml>
    <name><![CDATA[浙江]]></name>
    <child>
        <name><![CDATA[杭州]]></name>
        <child>
            <name><![CDATA[富阳]]></name>
            <name><![CDATA[桐庐]]></name>
        </child>
        <name><![CDATA[宁波]]></name>
        <child>
            <name><![CDATA[奉化]]></name>
            <name><![CDATA[慈溪]]></name>
        </child>
    </child>
</xml>

 

如果想要搞成一行,就把换行符去掉,有了源码就可以根据自己想要的来修改

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

s478853630

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值