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"
您可以为枚举成员更改所需的名称。有两种方法可以做到这一点:
如果可以修改架构,那么可以插入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 生成绑定文件将非常简单。这是一个例子:
<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和数字视为不同的单词。
| 归档时间: |
|
| 查看次数: |
778 次 |
| 最近记录: |