有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在JAXB中处理同一单词的不同大小写?

<xs:simpleType name="PowerUnit">
    <xs:restriction base="xs:int">
        <xs:enumeration value="MWh"/>
        <xs:enumeration value="mWh"/>
    </xs:restriction>
</xs:simpleType>

Jaxb无法为上面的示例生成类,其中MWh和MWh的拼写相同,但大小写不同。甚至,JAXB也没有显示任何错误。它只需生成除此枚举之外的其他文件

如何处理这种情况


共 (1) 个答案

  1. # 1 楼答案

    XML模式(Schema.xsd)

    下面是一个基于您的问题的XML模式示例。我必须将基类型更改为string以使其有效

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.example.org" 
        xmlns="http://www.example.org"
        elementFormDefault="qualified">
    
        <xs:simpleType name="PowerUnit">
            <xs:restriction base="xs:string">
                <xs:enumeration value="MWh" />
                <xs:enumeration value="mWh" />
            </xs:restriction>
        </xs:simpleType>
    
        <xs:complexType name="root">
            <xs:sequence>
                <xs:element name="power-unit" type="PowerUnit"/>
            </xs:sequence>
        </xs:complexType>
    
    </xs:schema>
    

    默认生成的类

    如果JAXB (JSR-222)实现无法生成枚举,那么它将创建基类型的属性

    package org.example;
    
    import javax.xml.bind.annotation.*;
    
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "root", propOrder = {
        "powerUnit"
    })
    public class Root {
    
        @XmlElement(name = "power-unit", required = true)
        protected String powerUnit;
    
        public String getPowerUnit() {
            return powerUnit;
        }
    
    }
    

    外部绑定文件(Binding.xml)

    可以使用外部绑定文件重命名枚举中的一个项

    <?xml version="1.0" encoding="UTF-8"?>
    <jxb:bindings
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
        version="2.1">
        <jxb:bindings schemaLocation="schema.xsd">
            <jxb:bindings node="//xs:simpleType[@name='PowerUnit']/xs:restriction/xs:enumeration[@value='mWh']">
                <jxb:typesafeEnumMember name="M"/>
            </jxb:bindings>
        </jxb:bindings>
    </jxb:bindings>
    

    新生成的类

    既然枚举中的名称冲突已经解决,那么将在生成的JAXB模型中使用一个枚举

    package org.example;
    
    import javax.xml.bind.annotation.*;
    
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "root", propOrder = {
        "powerUnit"
    })
    public class Root {
    
        @XmlElement(name = "power-unit", required = true)
        protected PowerUnit powerUnit;
    
    }
    

    Enum(PowerUnit)

    下面是生成的enum的样子:

    package org.example;
    
    import javax.xml.bind.annotation.*;
    
    @XmlType(name = "PowerUnit")
    @XmlEnum
    public enum PowerUnit {
    
        @XmlEnumValue("MWh")
        M_WH("MWh"),
        @XmlEnumValue("mWh")
        MWH2("mWh");
        private final String value;
    
        PowerUnit(String v) {
            value = v;
        }
    
        public String value() {
            return value;
        }
    
        public static PowerUnit fromValue(String v) {
            for (PowerUnit c: PowerUnit.values()) {
                if (c.value.equals(v)) {
                    return c;
                }
            }
            throw new IllegalArgumentException(v);
        }
    
    }