批量根据xml⽂件⽣成java实体类
应⽤背景:本⼈是医疗软件的开发者,有许多要跟其他⼚商交互的数据,这次是要接收来⾃平台的xml格式的数据。使⽤dom4j⼀样可以解析,但是这样的话后期不容易维护,⽽且程序可读性也差。(其实主要还是不能⽤Alt+/快捷键打出代码哈哈)
我的实现思路是先⽤xml样例⽣成xsd说明⽂件,然后再⽤xjc将说明⽂件⽣成java类
使⽤trang.jar⽣成xsd⽂件:
⾸先将你要⽣成xsd的xml⽂件和trang.jar放到⼀个⽂件夹
然后在这个⽂件夹的空⽩处右击“在此处打开Powershell窗⼝”菜单(当然你也可以⽤cmd进⼊这个⽂件夹也⼀样)输⼊图⽚上的命令就⽣成了xsd
使⽤jdk⾃带的⽣成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",
"st.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 = v("JAVA_HOME"); //获取jdk路径
if(!new File(javaHome).exists()) {
throw new Exception("没有配置jdk环境变量");
}
String java = javaHome +  "\\bin\\";
String xjc = javaHome + "\\bin\\";
File file = new File(xmlFileFolderPath);
xml文件怎么打开if(!ists() || !file.isDirectory()) {
throw new Exception("xml⽂件夹不存在,或此路径不是⽂件夹!");
}
File path = new File(javaFileFolderpath);//由于xjc⽆法指定不存在的⽬录,所以在这⾥判断⼀下,如果没有就创建⼀下新的⽬录
if(!ists()){
path.mkdirs();
}
File[] listFiles = file.listFiles();
for (File xmlFile : listFiles) {//遍历⽂件夹下⾯的xml
Name().endsWith(".xml")) {
//开始⽣成xsd
String xmlFileName = AbsolutePath();
String xsdFileName = place(".xml", ".xsd");
List<String> command = new ArrayList<String>();
command.add(java); //
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);//
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 {
Process p = pb.start();
BufferedReader reader = new BufferedReader(new InputStream()));  String line;
while ((line = adLine()) != 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((i)));
}
String();
}
public static String toString(Object value) {
if (value == null) {
return "";
}
String();
}
}