xsd枚举以数字下划线开头

时间:2014-12-18 00:04:14

标签: java xml enums jaxb xsd

使用jaxb从xsd定义生成java POJO源。在定义simpleType:String,枚举时,如果值以下划线或数字开头,则不会生成相应的Enum类。我如何使用模式或设置来生成这样的枚举。

<xsd:simpleType name="TrailerType">
    <xsd:restriction base="xsd:string">
        <xsd:enumeration value="_20FT"/>
        <xsd:enumeration value="OTHR"/>
    </xsd:restriction>

为了完成这项工作,我必须添加一个手动显式绑定

<jxb:bindings  schemaLocation="common/v1/CommonTypes.xsd" node="//xs:simpleType[@name='TrailerType']/xs:restriction/xs:enumeration[@value='_20FT']">
    <jxb:typesafeEnumMember name="_20FT"/>
</jxb:bindings>

现在这个工作,并且生成了具有值_20FT的枚举,但是如果我有很多这样的枚举,我将需要添加许多显式绑定。我确定有一种更简单,更通用的方法来处理这样的枚举名称。 请帮忙。

1 个答案:

答案 0 :(得分:0)

有两种方法可以解决您的问题。

首先通过全局绑定建议@lexicore

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<jaxb:bindings
  xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:annox="http://annox.dev.java.net"
  xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd"
  jaxb:extensionBindingPrefixes="xjc annox"
  version="2.1">

      <jaxb:globalBindings typesafeEnumMemberName="generateName"/>

</jaxb:bindings>

maven-jaxb2-plugin

生成枚举
@XmlType(name = "TrailerType")
@XmlEnum
public enum TrailerType {

    @XmlEnumValue("_20FT")
    VALUE_1("_20FT"),
    @XmlEnumValue("OTHR")
    VALUE_2("OTHR");
    private final String value;

    TrailerType(String v) {
        value = v;
    }

    public String value() {
        return value;
    }

    public static TrailerType fromValue(String v) {
        for (TrailerType c: TrailerType.values()) {
            if (c.value.equals(v)) {
                return c;
            }
        }
        throw new IllegalArgumentException(v);
    }

}

第二次通过简单绑定,如您所说的每个枚举

<bindings version="2.0" xmlns="http://java.sun.com/xml/ns/jaxb"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
    xmlns:annox="http://annox.dev.java.net">
    <bindings schemaLocation="pathOfYourXSD.xsd">
        <bindings node="//xs:simpleType[@name='TrailerType']/xs:restriction/xs:enumeration[@value='_20FT']">
            <typesafeEnumMember name="_20FT"/>
        </bindings>
    </bindings>
</bindings>

maven-jaxb2-plugin

生成枚举
@XmlType(name = "TrailerType")
@XmlEnum
public enum TrailerType {

    _20FT,
    OTHR;

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

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

}