xjc工具简介
xjc是Java Architecture for XML Binding也就是JAXB规范提供的命令行工具,全称为XML Schema to Java Compiler,它的核心作用是将XML Schema定义文件也就是XSD文件,编译生成对应的Java实体类。这些生成的类可以直接用于XML数据的序列化和反序列化操作,大大减少了开发者手动编写XML映射类的工作量。xjc工具随JDK一起发布,不需要额外安装依赖,在JDK的bin目录下就可以找到对应的可执行文件。

xjc基本使用语法
xjc的基本命令格式如下,其中很多参数可以根据实际需求调整:
xjc [options] schema.xsd -d output_dir -p package_name
常用参数说明:
- -d:指定生成的Java类的输出目录,目录不存在时会自动创建
- -p:指定生成的Java类的包名
- -encoding:指定XSD文件的编码格式,默认是UTF-8
- -b:指定外部绑定文件,用于自定义生成类的规则
- -extension:开启扩展模式,支持更多非标准的XSD特性
实战示例:编译XSD生成Java类
1. 准备XSD文件
首先创建一个简单的用户信息的XSD文件,命名为user.xsd,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://ippipp.com/user"
xmlns="http://ippipp.com/user"
elementFormDefault="qualified">
<xs:element name="user">
<xs:complexType>
<xs:sequence>
<xs:element name="id" type="xs:int"/>
<xs:element name="name" type="xs:string"/>
<xs:element name="age" type="xs:int" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
2. 执行xjc编译命令
打开命令行终端,切换到user.xsd所在的目录,执行以下命令:
xjc user.xsd -d ./src/main/java -p com.example.xml.dto -encoding UTF-8
命令执行成功后,会在./src/main/java/com/example/xml/dto目录下生成对应的Java类,主要包括:
- ObjectFactory类:用于创建XSD中定义的元素实例
- User类:对应XSD中定义的user复杂类型,包含id、name、age三个属性以及对应的getter和setter方法
3. 查看生成的Java类
生成的User类核心代码如下:
package com.example.xml.dto;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"id",
"name",
"age"
})
@XmlRootElement(name = "user")
public class User {
@XmlElement(required = true)
protected int id;
@XmlElement(required = true)
protected String name;
protected Integer age;
public int getId() {
return id;
}
public void setId(int value) {
this.id = value;
}
public String getName() {
return name;
}
public void setName(String value) {
this.name = value;
}
public Integer getAge() {
return age;
}
public void setAge(Integer value) {
this.age = value;
}
}
使用生成的类处理XML数据
生成Java类之后,可以直接使用JAXB的API进行XML的序列化和反序列化操作,以下是一个简单的反序列化示例:
import com.example.xml.dto.ObjectFactory;
import com.example.xml.dto.User;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import java.io.File;
public class XmlParseDemo {
public static void main(String[] args) {
try {
// 创建JAXB上下文,指定生成的类所在的包
JAXBContext context = JAXBContext.newInstance(ObjectFactory.class);
// 创建反序列化器
Unmarshaller unmarshaller = context.createUnmarshaller();
// 将XML文件转换为User对象
User user = (User) unmarshaller.unmarshal(new File("user.xml"));
System.out.println("用户ID:" + user.getId());
System.out.println("用户名称:" + user.getName());
System.out.println("用户年龄:" + user.getAge());
} catch (JAXBException e) {
e.printStackTrace();
}
}
}
常见问题与注意事项
- 如果使用的JDK版本是11及以上,JAXB相关的模块已经被移除,需要手动添加javax.xml.bind依赖才能使用xjc工具和生成的类
- XSD文件中如果存在重复的元素名称或者类型名称,可能会导致生成类时出现冲突,需要通过绑定文件自定义生成规则
- 生成类时建议指定明确的包名,避免默认包名导致的类冲突问题
- 如果XSD文件引用了其他XSD文件,需要在命令中同时指定所有的XSD文件路径,或者使用catalog文件管理引用关系
xjcXML_SchemaXSDJava类编译修改时间:2026-06-11 05:03:25