批量XSD文件生成Java对象

目录

 

1 什么是XSD(XML Schema Definition)?

2 xjc命令

3 实战

3.1 单个xsd文件转换为Java对象

3.2 N个xsd文件转换为Java对象


1 什么是XSD(XML Schema Definition)?

定义(来自百度百科)

XML Schema Definition 缩写.可扩展标记语言架构是以可扩展标记语言(标准通用标记语言的子集)为基础的,它用于可替代文档类型定义(外语缩写:DTD);一份XML schema文件描述了可扩展标记语言文档的结构。

它的作用是定义一份XML文档的合法组件群,就像文档类型定义(外语缩写:DTD)的作用一样,一份XML Schema定义了:

  • 可以出现在文档里的元素;

  • 可以出现在文档里的属性;

  • 哪些元素是子元素;

  • 子元素的顺序;

  • 子元素的数量;

  • 一个元素应是否能包含文本,或应该是空的;

  • 元素和属性的数据类型;

  • 元素和属性的默认值和固定值。

2 xjc命令

xjc属于jdk 的命令行工具,用于将schema文件生成java实体类。关于详细命令介绍,可参考该网站相关文档。

演示的是最简单的命令,使用了很多默认参数,实际上xjc支持的参数非常多,列举常用的几个参数及其含义。

参数 取值 含义
-b file/dir 指定其他的binding 文件 或文件夹
-d dir,默认为generated 生成的文件存放在该文件夹下
-p pkg,默认为generated 生成的Java文件使用的包名
-xmlschema 默认 指定输入为W3C XML Schema
-relaxng   指定输入为 RELAX NG
-relaxng-compact   指定输入为 RELAX NG compact
dtd   指定输入为 XML DTD
-version   查看 xjc 的版本
  1. 指定生成的 java 文件的包名: xjc -p com.traing.bean book.xsd 可以在生成的文件E:/JAXB/com/traing/book/Book.java中发现指定的包名。 package com.traing.bean;

  2. 指定生成的 java 文件路径: xjc book.xsd -d e:\JAXB\com 可以发现生成的文件位于E:/JAXB/com/Book.java,值得注意的是,这里的e:\JAXB\com必须是一个存在的文件夹,否则不成功,错误提示拒绝写入不存在的目录 "e:\JAXB\com"
  3. 将其他格式的 schema 转化为Java对象: xjc student.dtd -dtd 可以发现生成的文件E:/JAXB/generated/Student.java,此外还有其他的一些文件。 
  4. 一次性指定多个需要转换 schema 文件: xjc student.xsd grade.xsd 不用一个个转换了,可以指定多个schema文件,不过两个 schema 文件不能有重复的属性。

3 实战

3.1 单个xsd文件转换为Java对象

在cmd窗口,进入到xsd文件所在目录,执行如下命令,转换的java对象默认会生成到当前文件夹下。

xjc mytest.xsd -p com.bighuan.app.xmlschema.mytest -encoding UTF-8

一些说明:com.bighuan.app.xmlschema.mytest是生成Java类的包名,其他配置都是默认。

3.2 N个xsd文件转换为Java对象

N个xsd文件转换到对应的Java对象比较麻烦,自己网上查了一些资料,通过代码实现对应的转换。

准备工作:首先将所有需要转换的xsd文件放置到一个文件夹(eg:C:\\Users\\Administrator\\IdeaProjects\\xxxx\\xsd)下,并且在该文件夹先创建一个Test.java类

Test类源码如下,注释里有对应的说明。

/**
 *
 * @author: bighuan
 * @version: 1.0
 * @date: 2020/7/23
 * @time: 17:32
 * @description: 描述
 */
public class Test {
    public static void main(String[] args) {
        List list = new ArrayList<>();
        String path = "C:\\Users\\Administrator\\IdeaProjects\\xxxx\\xsd";
        File file = new File(path);
        File[] files = file.listFiles();
        System.out.println(files.length);
        for (File currFile:files) {
           // list.add("文件名:"+currFile.getName());
            System.out.println("文件名:"+currFile.getName());

            try {
                // String cmdStr = "cmd /c rd/s/q e:\\test" ;
                
                String name = currFile.getName(); // pcac.ries.052.xsd
                if(name.equals("Test.java")){
                    continue;
                }
                // 去掉.xsd后缀,并将文件名中的.替换为_,最终作为包名的一部分,看自己需求做改动
                String packname=name.substring(0,name.length()-4).replace(".","_");
                System.out.println("packname:"+packname);
                // 很重要的一步:就是拼接xjc转换xsd文件为Java类的命令,然后通过循环实现批量
                // XSD文件转换为Java类
                String cmdStr = "cmd /c xjc "+name+" -p com.bighuan.app.xmlschema."+packname+" -encoding UTF-8" ;
                // 原理:java的Runtime.getRuntime().exec("cmd命令")可以调用执行cmd指令。 
                Runtime.getRuntime().exec(cmdStr);
            }catch(Exception e){
                e.printStackTrace();
            }
        }

    }
}

关于Java调用windows的cmd.exe命令,可以参考该博客。

接下来,就是执行Test的main方法了。进入Test所在文件夹下,分别执行命令如下(ps:感觉回到了刚学Java的时候):

javac Test.java 

java Test

最终就实现了批量xsd文件转java的功能,如果xsd文件很多,一条命令一条命令来执行转换就太劳民伤财了。

你可能感兴趣的:(个人笔记,xsd转Java,批量xsd文件转Java,xsd)