目录
1 什么是XSD(XML Schema Definition)?
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 的版本 |
-
指定生成的 java 文件的包名:
xjc -p com.traing.bean book.xsd
可以在生成的文件E:/JAXB/com/traing/book/Book.java
中发现指定的包名。package com.traing.bean;
- 指定生成的 java 文件路径:
xjc book.xsd -d e:\JAXB\com
可以发现生成的文件位于E:/JAXB/com/Book.java
,值得注意的是,这里的e:\JAXB\com
必须是一个存在的文件夹,否则不成功,错误提示拒绝写入不存在的目录 "e:\JAXB\com"
。 - 将其他格式的 schema 转化为Java对象:
xjc student.dtd -dtd
可以发现生成的文件E:/JAXB/generated/Student.java
,此外还有其他的一些文件。 - 一次性指定多个需要转换 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<String> 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文件很多,一条命令一条命令来执行转换就太劳民伤财了。