删除使用xjc命令生成的java文件中的分数

时间:2014-06-10 23:26:21

标签: java xml xml-parsing jaxb xjc

我的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"

1 个答案:

答案 0 :(得分:4)

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

  1. JAXB映射文件
  2. XSD注释
  3. 使用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>
    

    这应该产生:

    @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生成绑定文件

    如果您不想单独复制相同的值,则使用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和数字视为不同的单词。