使用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> * <simpleType name="LogLevelType"> * <restriction base="{http://www.w3.org/2001/XMLSchema}string"> * <enumeration value="DEBUG"/> * <enumeration value="INFO"/> * <enumeration value="WARN"/> * <enumeration value="ERROR"/> * </restriction> * </simpleType> * </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
相关产品推荐
相关产品推荐

