Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JAXB:将元素类型xs:string绑定到枚举_Java_Xml_Enums_Jaxb - Fatal编程技术网

Java JAXB:将元素类型xs:string绑定到枚举

Java JAXB:将元素类型xs:string绑定到枚举,java,xml,enums,jaxb,Java,Xml,Enums,Jaxb,我的供应商向我提供了一个XSD,它的元素定义为字符串。但是在他的规范中,他指出该字符串只能有3个值中的1个: 例: 这表示缓解状态列表。可以是打开的、关闭的、无效的 我想在绑定文件中添加一些内容,以便在我解组XML时,状态不是字符串,而是枚举 我找到的所有文档似乎都表明XSD要求字符串为enum类型 是否有一种方法可以将字符串绑定到Enum类型,即使XSD不是Enum?您可以在XML模式中定义此限制,并根据下面指示的更改进行轻微修改,然后从中生成Java类 <xs:simpleTyp

我的供应商向我提供了一个
XSD
,它的元素定义为
字符串
。但是在他的规范中,他指出该字符串只能有3个值中的1个:

例:


这表示缓解状态列表。可以是打开的、关闭的、无效的
我想在绑定文件中添加一些内容,以便在我解组
XML
时,状态不是
字符串
,而是
枚举

我找到的所有文档似乎都表明
XSD
要求
字符串
enum
类型


是否有一种方法可以将字符串绑定到
Enum
类型,即使
XSD
不是
Enum

您可以在XML模式中定义此限制,并根据下面指示的更改进行轻微修改,然后从中生成Java类

 <xs:simpleType name="StatusType">
   <xs:restriction base="xs:string">
     <xs:enumeration value="OPEN"/>
     <xs:enumeration value="CLOSED"/>
     <xs:enumeration value="INVALID"/>
   </xs:restriction>
 </xs:simpleType>

...
  <xs:element name="status" minOccurs="0" maxOccurs="unbounded" type="StatusType"/>
...

我不知道你有什么问题,但下面的方法很好。如您所见,没有XSD,只有手动编码的JAXB类

public class Test {
    public static void main(String[] args) throws Exception {
        String xml = "<Path>\r\n" +
                     "  <Direction>North</Direction>\r\n" +
                     "  <Direction>North</Direction>\r\n" +
                     "  <Direction>East</Direction>\r\n" +
                     "  <Direction>South</Direction>\r\n" +
                     "</Path>";
        JAXBContext jaxbContext = JAXBContext.newInstance(Path.class);
        Path path = (Path)jaxbContext.createUnmarshaller().unmarshal(new StringReader(xml));
        for (Direction dir : path.directions)
            System.out.println(dir);
    }
}
@XmlEnum
enum Direction {
    @XmlEnumValue("North") NORTH,
    @XmlEnumValue("South") SOUTH,
    @XmlEnumValue("East")  EAST,
    @XmlEnumValue("West")  WEST
}
@XmlRootElement(name = "Path")
class Path {
    @XmlElement(name = "Direction")
    List<Direction> directions = new ArrayList<>();
}
在你写“我不知道你有什么问题”的时候回答这个问题听起来有点滑稽。另外,请注意,OP显式请求添加到绑定文件中。
<jaxb:bindings node="//xsd:complexType[@name='MitigationStatus']">
  <jaxb:bindings node="./xsd:element[@name='status']">
    <jaxb:property>
      <jaxb:baseType>
        <jaxb:javaType name="StatusImpl"
                       parseMethod="StatusImpl.parseStringToEnum"
                       printMethod="StatusImpl.printEnumToString"/>
      </jaxb:baseType>
    </jaxb:property>
  </jaxb:bindings>
</jaxb:bindings>
public class StatusImpl {
    public static StatusType parseStringToEnum( String value ){
        return StatusType.valueOf( value );
    }
    public static String printEnumToString( StatusType impl ){
        return impl.toString();
    }
}
public class Test {
    public static void main(String[] args) throws Exception {
        String xml = "<Path>\r\n" +
                     "  <Direction>North</Direction>\r\n" +
                     "  <Direction>North</Direction>\r\n" +
                     "  <Direction>East</Direction>\r\n" +
                     "  <Direction>South</Direction>\r\n" +
                     "</Path>";
        JAXBContext jaxbContext = JAXBContext.newInstance(Path.class);
        Path path = (Path)jaxbContext.createUnmarshaller().unmarshal(new StringReader(xml));
        for (Direction dir : path.directions)
            System.out.println(dir);
    }
}
@XmlEnum
enum Direction {
    @XmlEnumValue("North") NORTH,
    @XmlEnumValue("South") SOUTH,
    @XmlEnumValue("East")  EAST,
    @XmlEnumValue("West")  WEST
}
@XmlRootElement(name = "Path")
class Path {
    @XmlElement(name = "Direction")
    List<Direction> directions = new ArrayList<>();
}