批量根据xml文件生成java实体类
应用背景: 本人是医疗软件的开发者, 有许多要跟其他厂商交互的数据, 这次是要接收来自平台的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的解决方式,但是如果要是多个的话就需要写一个工具类来批量处理:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | 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<String> command = new ArrayList<String>(); 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<String> command2 = new ArrayList<String>(); 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<String> strs, String separator) { StringBuffer sb = new StringBuffer(); for ( int i = 0 ; i < strs.size(); i++) { if (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(); } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步