批量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支持的参数非常多,列举常用的几个参数及其含义。

参数取值含义
-bfile/dir指定其他的binding 文件 或文件夹
-ddir,默认为generated生成的文件存放在该文件夹下
-ppkg,默认为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<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文件很多,一条命令一条命令来执行转换就太劳民伤财了。

可以使用Java中的JAXB(Java Architecture for XML Binding)库来根据XSD文件生成XML。JAXB是Java EE的一部分,可以将Java对象映射到XML文档,并提供了在Java对象和XML文档之间进行转换的方法。 以下是使用JAXB生成XML的基本步骤: 1. 创建一个Java类,该类的属性对应于XSD文件中的元素和类型。 2. 使用JAXB的XJC工具从XSD文件生成Java类。这可以通过在命令行中使用xjc命令或在Eclipse中使用插件来完成。 3. 在Java代码中创建JAXBContext对象,该对象负责将Java对象转换为XML文档。 4. 创建Java对象,并设置其属性。 5. 使用JAXB Marshaller将Java对象转换为XML文档。 以下是一个简单的示例代码: ```java import javax.xml.bind.*; import java.io.*; public class GenerateXML { public static void main(String[] args) throws JAXBException, IOException { // 创建JAXBContext对象 JAXBContext jaxbContext = JAXBContext.newInstance(Person.class); // 创建Marshaller对象 Marshaller marshaller = jaxbContext.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); // 创建Java对象 Person person = new Person(); person.setName("John Doe"); person.setAge(30); // 将Java对象转换为XML文档 StringWriter writer = new StringWriter(); marshaller.marshal(person, writer); String xml = writer.toString(); System.out.println(xml); } } @XmlRootElement class Person { private String name; private int age; // getters and setters } ``` 在上面的示例中,我们创建了一个名为Person的Java类,并使用@XmlRootElement注解将其标记为根元素。然后,我们使用JAXBContext和Marshaller对象Java对象转换为XML文档。最后,我们使用StringWriter将XML文档输出到控制台。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值