前言
之前找了好多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>
如果想要搞成一行,就把换行符去掉,有了源码就可以根据自己想要的来修改