批量根据xml文件生成java实体类

2021-06-11 07:03

阅读:548

标签:files   变量   dem   文件   rect   inf   use   指定   builder   

 

应用背景: 本人是医疗软件的开发者, 有许多要跟其他厂商交互的数据, 这次是要接收来自平台的xml格式的数据。 使用dom4j一样可以解析,但是这样的话后期不容易维护,而且程序可读性也差。(其实主要还是不能用Alt+/快捷键打出代码哈哈)

我的实现思路是先用xml样例生成xsd说明文件,然后再用xjc将说明文件生成java类

使用trang.jar生成xsd文件:
首先将你要生成xsd的xml文件和trang.jar放到一个文件夹中

技术图片
然后在这个文件夹的空白处右击“在此处打开Powershell窗口”菜单(当然你也可以用cmd进入这个文件夹也一样)输入图片上的命令就生成了xsd

技术图片
使用jdk自带的xjc.exe生成java类:
直接在刚刚的Powershell中输入xjc patient_info.xsd 即可

技术图片
如果你不指定包名,那么就生成在默认文件夹中

技术图片
也可以在后面跟一个 -p (包名) 那么就会生成在你想要包里面

当然, 这只是一两个xml的解决方式,但是如果要是多个的话就需要写一个工具类来批量处理:

import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;


public class CreateXmlBean {
	public static void main(String[] args) throws Exception {
		createXmlBean("C:\\Users\\lrxsz\\Desktop\\demo\\xml\\trang.jar", "C:\\Users\\lrxsz\\Desktop\\demo\\xml", 
				"com.test.structs", "C:\\Users\\lrxsz\\Desktop\\demo\\xml\\created");
	}
	/**
	 * 将xml文件生成成java实体类
	 * @param trangLibPath 存放trang的路径
	 * @param xmlFileFolderPath 存放xml文件的文件夹
	 * @param packageName 生成的java实体类的包名
	 * @param javaFileFolderpath 生成后的java实体类的文件夹
	 * @throws Exception 
	 */
	public static void createXmlBean(String trangLibPath, String xmlFileFolderPath, String packageName, String javaFileFolderpath) throws Exception {
		String javaHome = System.getenv("JAVA_HOME"); //获取jdk路径
		if(!new File(javaHome).exists()) {
			throw new Exception("没有配置jdk环境变量");
		}
		String java = javaHome +  "\\bin\\java.exe";
		String xjc = javaHome + "\\bin\\xjc.exe";
		File file = new File(xmlFileFolderPath);
		if(!file.exists() || !file.isDirectory()) {
			throw new Exception("xml文件夹不存在,或此路径不是文件夹!");
		}
		File path = new File(javaFileFolderpath);//由于xjc无法指定不存在的目录,所以在这里判断一下,如果没有就创建一下新的目录
		if(!path.exists()){
			path.mkdirs();
		}
		File[] listFiles = file.listFiles();
		for (File xmlFile : listFiles) {//遍历文件夹下面的xml
			if(xmlFile.getName().endsWith(".xml")) {
				//开始生成xsd
				String xmlFileName = xmlFile.getAbsolutePath();
				String xsdFileName = xmlFileName.replace(".xml", ".xsd");
				List command = new ArrayList();
				command.add(java); //java.exe
				command.add("-jar"); 
				command.add(trangLibPath); //trang.jar
				command.add(xmlFileName); //xml文件名
				command.add(xsdFileName); //xsd文件名
				System.out.println(join(command, " "));
				execute(new ProcessBuilder(command));
				
				//开始生成java类
				List command2 = new ArrayList();
				command2.add(xjc);//xjc.exe
				command2.add("-p");
				command2.add(packageName);//包名
				command2.add(xsdFileName);//xsd文件名
				command2.add("-d");
				command2.add(javaFileFolderpath); //java文件存放目录
				System.out.println(join(command2, " "));
				execute(new ProcessBuilder(command2));
				
				File xsdFile = new File(xsdFileName);
				xsdFile.delete();//将xsd文件删除
			}
		}
	}
	private static void execute(ProcessBuilder pb) {
		try {
			pb.redirectErrorStream(true);
			Process p = pb.start();
			BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
			String line;
			while ((line = reader.readLine()) != null) {
				System.out.println(line);
			}
			reader.close();
			p.waitFor();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
	public static String join(List strs, String separator) {
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i  0) {
				sb.append(toString(separator));
			}
			sb.append(toString(strs.get(i)));
		}
		return sb.toString();
	}
	public static String toString(Object value) {
		if (value == null) {
			return "";
		}
		return value.toString();
	}
}

  

批量根据xml文件生成java实体类

标签:files   变量   dem   文件   rect   inf   use   指定   builder   

原文地址:https://www.cnblogs.com/lrxsznbe/p/14226607.html


评论


亲,登录后才可以留言!