基于XML Schema生成Kotlin数据类及XML绑定问题求助
解决Kotlin XML映射无数据及Fedora下XJC安装问题
一、先搞定Fedora上的XJC工具
XJC是JAXB工具链的核心工具,用来从XSD生成映射类,Fedora上不用额外折腾,按以下步骤来:
- 如果你用的是JDK 8:直接在终端敲
xjc就能用,JDK8内置了完整的JAXB工具 - 如果你用的是JDK 9+:JAXB被移出了JDK核心,两种解决方式:
- 安装Fedora官方包:
sudo dnf install jaxb-utils,安装完就能正常用xjc命令 - 项目里通过Maven/Gradle引入JAXB依赖,后续直接在构建脚本里配置生成任务
- 安装Fedora官方包:
二、用XJC生成正确的Kotlin数据类
XJC默认生成Java类,转Kotlin有两种省心的方式:
- Java转Kotlin自动转换:
先运行xjc path/to/your/schema.xsd -d src/main/java生成Java类,然后用IntelliJ IDEA右键点击Java文件,选择「Convert Java File to Kotlin File」,工具会自动把Java的JAXB注解转换成Kotlin兼容的格式,完全不用手动改 - 直接生成Kotlin类:
用xjc-kotlin-plugin插件,Gradle配置示例:
运行plugins { id("java") id("org.jetbrains.kotlin.jvm") version "1.9.0" } dependencies { implementation("javax.xml.bind:jaxb-api:2.3.1") implementation("com.sun.xml.bind:jaxb-impl:2.3.1") xjc("com.github.mangstadt:xjc-kotlin-plugin:1.6.0") } val xjcGenerate by tasks.creating(Exec::class) { commandLine("xjc", "-plugin", "kotlin", "-d", "src/main/kotlin", "src/main/resources/your-schema.xsd") }./gradlew xjcGenerate就能直接生成带正确注解的Kotlin数据类
三、手动写数据类的常见坑(为什么没数据)
如果坚持手动写,检查以下几点:
- 根类必须加
@XmlRootElement(name = "你的XML根节点名"),大小写完全匹配 - 字段要加
@XmlElement(name = "XML里的子节点名"),别漏了,JAXB不会自动匹配字段名和标签名 - 必须要有无参构造函数:Kotlin数据类如果所有字段都有默认值会自动生成,但如果有非空字段没默认值,要手动加
constructor() - 字段用
var而不是val:JAXB需要给字段赋值,val是只读的,没法注入数据 - 嵌套结构要加
@XmlElementWrapper:如果XML里有重复的子节点(比如<list><item>...</item></list>),外层字段要加@XmlElementWrapper(name = "list"),内层加@XmlElement(name = "item")
四、验证映射的测试代码
不管是自动生成还是手动写的类,用这段代码测试:
import javax.xml.bind.JAXBContext import java.io.File fun main() { val context = JAXBContext.newInstance(YourRootClass::class.java) val unmarshaller = context.createUnmarshaller() val xmlFile = File("src/main/resources/your-data.xml") val data = unmarshaller.unmarshal(xmlFile) as YourRootClass // 直接打印具体字段,别只打印对象 println(data.someField) println(data.nestedObject?.anotherField) }
如果还是没数据,打开XML检查:
- 根节点名和注解里的完全一致
- XML有没有命名空间?如果XSD里定义了命名空间,类上要加
@XmlSchema(namespace = "你的命名空间")
内容的提问来源于stack exchange,提问作者Pferdesalbe
相关产品推荐
相关产品推荐

