操作xml的具体方法
package xml;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import utils.StringEx;
import java.beans.PropertyDescriptor;
import java.io.File;
import java.io.FileOutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class OperateXML {
public static String writeXml(List<Object> list){
Document doc = DocumentHelper.createDocument();
Element listRoot = doc.addElement("list");
//list写入到Document对象中
list.parallelStream().forEach(p -> {
String className = p.getClass().getSimpleName();
Element obj = listRoot.addElement(className);
//对每个对象进行遍历 获取所有的方法
List<String> methodList = new ArrayList<>();
//1、获取自身的所有方法 public protected private 这里只要获取自身的就足够了
for(Method method : p.getClass().getDeclaredMethods()) {
methodList.add(method.getName());
}
//2、获取自身的所有方法 public protected private + extends 父类 + implements 接口的方法
/*for(Method method : p.getClass().getMethods()) {
methodList.add(method.getName());
}*/
//获取所有的字段 和 标准的 get方法
Field[] fields = p.getClass().getDeclaredFields();
for(Field field : fields) {
try{
String name = field.getName();
//添加属性
Element element = obj.addElement(name);
String methodName = "get" + field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1);
Method method;
if(methodList.contains(methodName)) {
method = p.getClass().getDeclaredMethod(methodName);
Object value = method.invoke(p);
element.addText(value.toString());
//System.out.println(name + ":" + value);
} else {
System.out.println(name + ":没有此方法");
element.addText("");
}
}catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
});
//物理存储
File xmlFile = null;
try {
XMLWriter writer = new XMLWriter(OutputFormat.createPrettyPrint());
String fileName = StringEx.newUUID()+".xml";
//获取类所在路径
String path = OperateXML.class.getProtectionDomain().getCodeSource().getLocation().getPath() + File.separator + "xmlPath";
File xmlFilePath = new File(path);
if (!xmlFilePath.exists()) {
xmlFilePath.mkdirs();
}
xmlFile = new File(xmlFilePath+File.separator+fileName);
FileOutputStream fos = new FileOutputStream(xmlFile);
writer.setOutputStream(fos);
writer.write(doc);
//System.out.println("写出完毕!");
writer.close();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
//返回 路径+生成的文件名
return xmlFile.getAbsolutePath();
}
public static List<Object> readXml(String path) {
Field[] fields = ObjectOne.class.getDeclaredFields();
String className = ObjectOne.class.getSimpleName();
List<Object> objList = new ArrayList<Object>();
try {
SAXReader reader = new SAXReader();
Document doc = reader.read(new File(path));
Element root = doc.getRootElement();
List<Element> nextList = root.elements(className);
String fieldValue = "";
for(int k=0;k < nextList.size();k++){
ObjectOne p = new ObjectOne();
Method method;
for(Field field:fields){
Element fieldValueEle = nextList.get(k).element(field.getName());
fieldValue = fieldValueEle.getText();
String methodName = "set"+field.getName().substring(0,1).toUpperCase()+field.getName().substring(1);
method = p.getClass().getDeclaredMethod(methodName,String.class);
method.invoke(p,fieldValue);
}
objList.add(p);
}
className = ObjectTwo.class.getSimpleName();
fields = ObjectTwo.class.getDeclaredFields();
nextList = root.elements(className);
fieldValue = "";
for(int k=0;k < nextList.size();k++){
ObjectTwo p = new ObjectTwo();
Method method;
for(Field field:fields){
Element fieldValueEle = nextList.get(k).element(field.getName());
fieldValue = fieldValueEle.getText();
List<ObjectOne> list = null;
if(field.getName().equals("teamMemberList")){
list = JSONArray.parseArray(fieldValue,ObjectOne.class);
}
String methodName = "set"+field.getName().substring(0,1).toUpperCase()+field.getName().substring(1);
PropertyDescriptor pd = new PropertyDescriptor(field.getName(), p.getClass());
method = pd.getWriteMethod();//获得写方法
if(!field.getName().equals("teamMemberList")){
method.invoke(p,fieldValue);
}else{
p.setTeamMemberList(list);
}
}
objList.add(p);
}
} catch (Exception e) {
e.printStackTrace();
}
return objList;
}
}
package xml;
public class ObjectOne {
private String userId;
private String userName;
private String userSex;
private String userAge;
public ObjectOne() {
}
public ObjectOne(String userId, String userName, String userSex, String userAge) {
this.userId = userId;
this.userName = userName;
this.userSex = userSex;
this.userAge = userAge;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserSex() {
return userSex;
}
public void setUserSex(String userSex) {
this.userSex = userSex;
}
public String getUserAge() {
return userAge;
}
public void setUserAge(String userAge) {
this.userAge = userAge;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("{");
sb.append("\"userId\":\"")
.append(userId).append('\"');
sb.append(",\"userName\":\"")
.append(userName).append('\"');
sb.append(",\"userSex\":\"")
.append(userSex).append('\"');
sb.append(",\"userAge\":\"")
.append(userAge).append('\"');
sb.append('}');
return sb.toString();
}
}
package xml;
import java.util.List;
public class ObjectTwo {
private String teamId;
private String teamName;
private String teamSize;
private List<ObjectOne> teamMemberList;
public ObjectTwo() {
}
public ObjectTwo(String teamId, String teamName, String teamSize, List<ObjectOne> teamMemberList) {
this.teamId = teamId;
this.teamName = teamName;
this.teamSize = teamSize;
this.teamMemberList = teamMemberList;
}
public String getTeamId() {
return teamId;
}
public void setTeamId(String teamId) {
this.teamId = teamId;
}
public String getTeamName() {
return teamName;
}
public void setTeamName(String teamName) {
this.teamName = teamName;
}
public String getTeamSize() {
return teamSize;
}
public void setTeamSize(String teamSize) {
this.teamSize = teamSize;
}
public List<ObjectOne> getTeamMemberList() {
return teamMemberList;
}
public void setTeamMemberList(List<ObjectOne> teamMemberList) {
this.teamMemberList = teamMemberList;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("{");
sb.append("\"teamId\":\"")
.append(teamId).append('\"');
sb.append(",\"teamName\":\"")
.append(teamName).append('\"');
sb.append(",\"teamSize\":\"")
.append(teamSize).append('\"');
sb.append(",\"teamMemberList\":")
.append(teamMemberList);
sb.append('}');
return sb.toString();
}
}
主函数执行
package xml;
import utils.StringEx;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class App {
public static void main(String args[]){
List<Object> objList = new LinkedList<>();
List<ObjectOne> objOneList = new LinkedList<>();
ObjectOne objectOne = new ObjectOne(StringEx.newUUID(),"裘千仞","1","55");
objList.add(objectOne);
objOneList.add(objectOne);
objectOne = new ObjectOne(StringEx.newUUID(),"欧阳锋","1","45");
objList.add(objectOne);
objOneList.add(objectOne);
objectOne = new ObjectOne(StringEx.newUUID(),"黄药师","1","44");
objList.add(objectOne);
objOneList.add(objectOne);
objectOne = new ObjectOne(StringEx.newUUID(),"洪七公","1","43");
objList.add(objectOne);
objOneList.add(objectOne);
ObjectTwo objectTwo = new ObjectTwo(StringEx.newUUID(),"青帮",String.valueOf(objOneList.size()),objOneList);
objList.add(objectTwo);
String fileName = OperateXML.writeXml(objList);
System.out.println(fileName);
System.out.println(OperateXML.readXml(fileName));
}
}
StringEx中的newUUID()方法
public static final String newUUID() {
return UUID.randomUUID().toString().replace("-", "").toUpperCase();
}