删除使用xjc命令生成的Java文件中的分数不足

use*_*404 4 java xml jaxb xjc xml-parsing

我的xsd架构中有以下几行

<simpleType name="IdTypeEnum">
    <restriction base="token">
    <enumeration value="SIP1"></enumeration>
        <enumeration value="SIP2"></enumeration>
Run Code Online (Sandbox Code Playgroud)

在生成的java文件中,我有以下代码

@XmlEnumValue("SIP2")
SIP_2("SIP2"),
@XmlEnumValue("CUSIP3")
SIP_3("SIP3"),
Run Code Online (Sandbox Code Playgroud)

我想删除生成的Java文件中的下划线,以便上面的代码看起来像这样

 @XmlEnumValue("SIP2")
SIP2("SIP2"),
@XmlEnumValue("CUSIP3")
SIP3("SIP3"),
Run Code Online (Sandbox Code Playgroud)

有什么方法可以调整xjc命令,使其以上述方式生成Java文件?

我的架构使用 elementFormDefault="qualified"

hel*_*cha 5

可以为枚举成员更改所需的名称。有两种方法可以做到这一点:

  1. JAXB映射文件
  2. XSD注释

使用XSD注释

如果可以修改架构,那么可以插入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>
Run Code Online (Sandbox Code Playgroud)

这将生成:

@XmlEnum
public enum IdTypeEnum {
    SIP1,
    SIP2;
    ...
Run Code Online (Sandbox Code Playgroud)

没有任何@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>
Run Code Online (Sandbox Code Playgroud)

并在运行时包括绑定文件xjc

xjc -b bindings-file.xml sip.xsd
Run Code Online (Sandbox Code Playgroud)

使用XSLT生成绑定文件

如果您不想单独复制相同的值,那么使用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>
Run Code Online (Sandbox Code Playgroud)

您可以在此XSLT Fiddle中对其进行测试,也可以使用它来生成绑定文件。


我不确定为什么没有必要xjc在您的枚举中自动添加下划线。通常,当枚举会生成非法的Java标识符(例如以数字开头,包含破折号等)时,这样做是可能的,这可能是使用了一些基于Java编码约定的算法(而Java枚举和常量通常是大写的,带有下划线分隔的不同单词)。它可能会将SIP和数字视为不同的单词。