我的xsd架构中有以下几行
<simpleType name="IdTypeEnum">
<restriction base="token">
<enumeration value="SIP1"></enumeration>
<enumeration value="SIP2"></enumeration>
在生成的java文件中,我有以下代码
@XmlEnumValue("SIP2")
SIP_2("SIP2"),
@XmlEnumValue("CUSIP3")
SIP_3("SIP3"),
我想删除生成的java文件中的下划线,以便上面的代码看起来像这样
@XmlEnumValue("SIP2")
SIP2("SIP2"),
@XmlEnumValue("CUSIP3")
SIP3("SIP3"),
有没有什么方法可以调整xjc命令,以便以上述方式生成java文件?
我的架构使用elementFormDefault="qualified"
答案 0 :(得分:4)
您可以更改枚举成员所需的名称。有两种方法可以做到这一点:
如果您可以修改架构,可以将JAXB元素作为<xs:appinfo>
扩展插入:
<simpleType name="IdTypeEnum">
<restriction base="token">
<enumeration value="SIP1">
<annotation>
<appinfo>
<jaxb:typesafeEnumMember name="SIP1" />
</appinfo>
</annotation>
</enumeration>
<enumeration value="SIP2">
<annotation>
<appinfo>
<jaxb:typesafeEnumMember name="SIP2" />
</appinfo>
</annotation>
</enumeration>
...
</restriction>
</simpleType>
这应该产生:
@XmlEnum
public enum IdTypeEnum {
SIP1,
SIP2;
...
没有任何@XmlEnumValue
注释,因为现在它们具有相同的名称。
如果您无法更改架构,也可以使用 JAXB绑定执行此操作:
<jaxb:bindings version="2.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb">
<jaxb:bindings schemaLocation="sip.xsd">
<jaxb:bindings node="//xs:simpleType[@name='IdTypeEnum']/xs:restriction/xs:enumeration[@value='SIP1']">
<jaxb:typesafeEnumMember name="SIP1"/>
</jaxb:bindings>
<jaxb:bindings node="//xs:simpleType[@name='IdTypeEnum']/xs:restriction/xs:enumeration[@value='SIP2']">
<jaxb:typesafeEnumMember name="SIP2"/>
</jaxb:bindings>
</jaxb:bindings>
</jaxb:bindings>
运行xjc
时包含绑定文件:
xjc -b bindings-file.xml sip.xsd
如果您不想单独复制相同的值,则使用XSLT生成绑定文件非常简单。这是一个例子:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
version="1.0">
<xsl:output indent="yes"/>
<xsl:template match="/"> <!-- this templates sets the bindings file structure -->
<jaxb:bindings version="2.0">
<jaxb:bindings schemaLocation="sip.xsd">
<xsl:apply-templates select="//xs:simpleType[@name='IdTypeEnum']/xs:restriction/xs:enumeration"/>
</jaxb:bindings>
</jaxb:bindings>
</xsl:template>
<xsl:template match="xs:enumeration"> <!-- this template creates a bindings block -->
<jaxb:bindings node="//xs:simpleType[@name='IdTypeEnum']/xs:restriction/xs:enumeration[@value='{@value}']">
<jaxb:typesafeEnumMember name="{@value}"/>
</jaxb:bindings>
</xsl:template>
</xsl:stylesheet>
您可以在此XSLT Fiddle中对其进行测试,也可以使用它来生成绑定文件。
我不确定为什么xjc
会在您的枚举中自动引入下划线,因为它不是必需的。当枚举产生非法的Java标识符(例如以数字开头,包含破折号等)时,它通常会这样做。它可能使用基于 Java编码约定的某种算法(其中和Java)枚举和常量通常是大写的,不同的单词用下划线分隔。它可能会将SIP
和数字视为不同的单词。