利用Java基础知识以及递归做的一个简略版的XML转换工具,可以将集合、对象以及嵌套对象自动转换为XML格式的文本
import java.lang.reflect.Field;
import java.util.*;
/**
* @author ShangXiangYang
* @date 2022/1/28 15:19
*/
public class XMLUtil {
/**
* object转XML入口
* @param obj 待转换对象
* @return xml格式的字符串
* @throws Exception 异常
*/
public static String toXML(Object obj) throws Exception {
String xml = "";
if (null == obj){
throw new Exception("object对象为空,无法转换!");
}
if (obj instanceof Collection){
xml = arrayToXML(obj);
}else {
xml = objectToXML(obj);
}
return xml;
}
/**
* object转XML入口
* @param obj 待转换对象
* @param rootName 根节点名称
* @return xml格式的字符串
* @throws Exception 异常
*/
public static String toXML(Object obj, String rootName) throws Exception {
String xml = "";
if (null == obj){
throw new Exception("object对象为空,无法转换!");
}
if (null == rootName || "".equals(rootName)){
throw new Exception("根节点名称为空,无法转换!");
}
if (obj instanceof Collection){
xml = arrayToXML(obj, rootName);
}else {
xml = objectToXML(obj,rootName);
}
return xml;
}
/**
* 将对象转化成XML格式
* @param obj 待转换对象
* @return XML格式的字符串
* @throws Exception 异常
*/
private static String objectToXML(Object obj) throws Exception {
StringBuilder xml = new StringBuilder();
if (null == obj){
throw new Exception("object对象为空,无法转换!");
}
Class objClass = obj.getClass();
String name = objClass.getSimpleName().toUpperCase();
Field[] fields = objClass.getDeclaredFields();
xml.append("<").append(name).append(">");
for (Field field : fields) {
field.setAccessible(true);
String fieldType = field.getType().getSimpleName().toUpperCase();
if (!"STRING".equals(fieldType)){
if (null == field.get(obj)){
xml.append("<").append(fieldType).append(">");
//xml.append("null");
xml.append("</").append(fieldType).append(">");
continue;
}
String s = objectToXML(field.get(obj));
xml.append(s);
continue;
}
String fieldName = field.getName().toUpperCase();
xml.append("<").append(fieldName).append(">");
Object fieldValue = field.get(obj);
xml.append(fieldValue);
xml.append("</").append(fieldName).append(">");
}
xml.append("</").append(name).append(">");
return xml.toString();
}
/**
* 将对象转化成XML格式
* @param obj 待转换对象
* @param rootName 根节点名称
* @return XML格式的字符串
* @throws Exception 异常
*/
private static String objectToXML(Object obj,String rootName) throws Exception {
StringBuilder xml = new StringBuilder();
if (null == obj){
throw new Exception("object对象为空,无法转换!");
}
Class objClass = obj.getClass();
Field[] fields = objClass.getDeclaredFields();
xml.append("<").append(rootName).append(">");
for (Field field : fields) {
field.setAccessible(true);
String fieldType = field.getType().getSimpleName().toUpperCase();
if (!"STRING".equals(fieldType)){
if (null == field.get(obj)){
xml.append("<").append(fieldType).append(">");
//xml.append("null");
xml.append("</").append(fieldType).append(">");
continue;
}
String s = objectToXML(field.get(obj));
xml.append(s);
continue;
}
String fieldName = field.getName().toUpperCase();
xml.append("<").append(fieldName).append(">");
Object fieldValue = field.get(obj);
xml.append(fieldValue);
xml.append("</").append(fieldName).append(">");
}
xml.append("</").append(rootName).append(">");
return xml.toString();
}
/**
* 将对象转化成XML格式,不完善
* @param obj 待转换对象
* @throws Exception 异常
*/
private static void objectToXML2(Object obj) throws Exception {
if (null == obj){
throw new Exception("该对象为空");
}
StringBuilder xml = new StringBuilder();
LinkedList<Object> list = new LinkedList<>();
Class<?> objClass = obj.getClass();
String className = objClass.getSimpleName();
xml.append("<").append(className).append(">");
Field[] fields = objClass.getDeclaredFields();
for (Field field : fields) {
if ("String".equals(field.getType().getSimpleName())){
field.setAccessible(true);
String fieldName = field.getName();
xml.append("<").append(fieldName).append(">");
Object fieldValue = field.get(obj);
if (null == fieldValue){
xml.append("</").append(fieldName).append(">");
}else {
xml.append(fieldValue.toString());
xml.append("</").append(fieldName).append(">");
}
}else {
String fieldName = field.getName();
field.setAccessible(true);
list.add(field.get(obj));
}
}
Object objTemp;
boolean isEnd = true;
while (!list.isEmpty()){
objTemp = list.removeFirst();
if (null == objTemp){
continue;
}
Class<?> objTempClass = objTemp.getClass();
String simpleName = objTempClass.getSimpleName();
xml.append("<").append(simpleName).append(">");
Field[] fields2 = objTempClass.getDeclaredFields();
for (Field field : fields2) {
if ("String".equals(field.getType().getSimpleName())){
field.setAccessible(true);
String fieldName = field.getName();
xml.append("<").append(fieldName).append(">");
Object fieldValue = field.get(objTemp);
if (null == fieldValue){
xml.append("</").append(fieldName).append(">");
}else {
xml.append(fieldValue.toString());
xml.append("</").append(fieldName).append(">");
}
}else {
String fieldName = field.getName();
xml.append("<").append(fieldName).append(">");
field.setAccessible(true);
list.add(field.get(objTemp));
}
}
xml.append("</").append(simpleName).append(">");
}
xml.append("</").append(className).append(">");
System.out.println(xml.toString());
}
/**
* 将集合类型对象转化成XML格式
* @param obj 待转化的集合类型对象
* @return XML格式的字符串
* @throws Exception 异常
*/
private static String arrayToXML (Object obj) throws Exception {
if (null == obj){
throw new Exception("object对象为空,无法转换!");
}
if (!(obj instanceof Collection)){
throw new Exception("object对象非集合类型,无法转换!");
}
StringBuilder xml = new StringBuilder();
Class objClass = obj.getClass();
String simpleName = objClass.getSimpleName().toUpperCase();
xml.append("<").append(simpleName).append(">");
if (obj instanceof List){
List list = (List)obj;
for (Object o : list) {
String objectToXML = objectToXML(o);
xml.append(objectToXML);
}
}
xml.append("</").append(simpleName).append(">");
return xml.toString();
}
/**
* 将集合类型对象转化成XML格式
* @param obj 待转化的集合类型对象
* @param rootName 根节点名称
* @return XML格式的字符串
* @throws Exception 异常
*/
private static String arrayToXML (Object obj, String rootName) throws Exception {
if (null == obj){
throw new Exception("object对象为空,无法转换!");
}
if (!(obj instanceof Collection)){
throw new Exception("object对象非集合类型,无法转换!");
}
StringBuilder xml = new StringBuilder();
xml.append("<").append(rootName).append(">");
if (obj instanceof List){
List list = (List)obj;
for (Object o : list) {
String objectToXML = objectToXML(o);
xml.append(objectToXML);
}
}
xml.append("</").append(rootName).append(">");
return xml.toString();
}
}