You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用JAXB从Kotlin枚举类生成XML Schema

嘿,我来帮你搞定从Kotlin枚举类生成XML Schema的事儿~结合你给出的从XSD生成的Java枚举代码,咱们分两种方式来实现:

首先,先把你提供的Java枚举代码补全(方便对应到Kotlin版本):

import javax.xml.bind.annotation.XmlEnum;
import javax.xml.bind.annotation.XmlType;

/**
 * <p>Java class for LogLevelType.
 *
 * <p>The following schema fragment specifies the expected content contained within this class.
 * <p>
 * <pre>
 * &lt;simpleType name="LogLevelType"&gt;
 *   &lt;restriction base="{http://www.w3.org/2001/XMLSchema}string"&gt;
 *     &lt;enumeration value="DEBUG"/&gt;
 *     &lt;enumeration value="INFO"/&gt;
 *     &lt;enumeration value="WARN"/&gt;
 *     &lt;enumeration value="ERROR"/&gt;
 *   &lt;/restriction&gt;
 * &lt;/simpleType&gt;
 * </pre>
 */
@XmlType(name = "LogLevelType")
@XmlEnum
public enum LogLevelType {

    DEBUG,
    INFO,
    WARN,
    ERROR;

    public String value() {
        return name();
    }

    public static LogLevelType fromValue(String v) {
        return valueOf(v);
    }

}

对应的Kotlin枚举类应该是这样的(保留JAXB注解,方便工具识别):

import javax.xml.bind.annotation.XmlEnum
import javax.xml.bind.annotation.XmlType

/**
 * <p>Kotlin class for LogLevelType.
 *
 * <p>Corresponding to the XML Schema simple type LogLevelType
 */
@XmlType(name = "LogLevelType")
@XmlEnum
enum class LogLevelType {
    DEBUG,
    INFO,
    WARN,
    ERROR;

    fun value(): String = name

    companion object {
        fun fromValue(v: String): LogLevelType = valueOf(v)
    }
}

方法1:用JAXB的schemagen工具自动生成

这是最省事的方式,利用JAXB的工具从带注解的Kotlin类反向生成XSD:

  • 先确保项目引入JAXB依赖(比如jakarta.xml.bind:jakarta.xml.bind-api和实现org.glassfish.jaxb:jaxb-runtime)
  • 编译你的Kotlin枚举类,得到字节码文件
  • 运行schemagen命令,指定类路径和枚举类全限定名:
schemagen -cp ./build/classes/kotlin/main com.example.LogLevelType

执行后会生成一个XSD文件(比如schema1.xsd),内容和你之前看到的XSD片段完全一致。

方法2:手动编写XML Schema

如果不想用工具,也可以直接手动写出匹配的XSD,完全对应枚举的取值:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">

    <xs:simpleType name="LogLevelType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="DEBUG"/>
            <xs:enumeration value="INFO"/>
            <xs:enumeration value="WARN"/>
            <xs:enumeration value="ERROR"/>
        </xs:restriction>
    </xs:simpleType>

</xs:schema>

这个XSD定义的简单类型和你的Kotlin枚举完全匹配,能用来验证XML中的日志级别取值是否合法。

内容的提问来源于stack exchange,提问作者Johan Vergeer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:40:43