枚举列表

时间:2017-01-24 08:26:02

标签: xml xsd schema xsd-validation

我有一个XML,我需要使用XSD在Schema中使用Enumeration类型验证属性值。

示例XML:

<Test StatusValue="X R,Y">
    <TestXSD>TestXSD</TestXSD>
    <xsd>xsd</xsd>
</Test>

上面我需要验证属性值X和Y是我的Enumeration模式列表的一部分。

Schema中的枚举列表如下

   <xs:simpleType name="StatusGroup">
     <xs:restriction base="xs:string">
       <xs:enumeration value="X R"/>
       <xs:enumeration value="Y"/>
       <xs:enumeration value="Z"/>
       <xs:enumeration value="A"/>
       <xs:enumeration value="B"/>
       <xs:enumeration value="C"/>
       <xs:enumeration value="D"/>
       <xs:enumeration value="E"/>
     </xs:restriction>  
 </xs:simpleType>

由于两个值之间存在逗号分隔,我无法验证值。 X, Y

1 个答案:

答案 0 :(得分:0)

更新

OP表示他无法更改xml和xsd,因此我们通过JAXB的XMLAdapter转到解决方案:

public class Test {
  @XmlElement(name = "StatusValue")
  @XmlJavaTypeAdapter(StatusValueAdapter.class)
  public List<StatusGroup> getStatusValues(){}
}

public class StatusValueAdapter extends XmlAdapter<String, List<StatusGroup>> {
  public List<StatusGroup> unmarshal(String content) throws Exception {
    // content = "X R,Y"
    final String[] split = content.split(",");
    // validate here against your enum
  }
}

@XmlEnum 
public enum StatusGroup {}

更多:

您可以按以下方式定义StatusValue

<xs:complexType name="Test">
    ...
    <xs:attribute name="StatusValue" type="StatusList" minOccurs="0" maxOccurs="1"/>
  </xs:complexType>

<xs:simpleType name="StatusList">
    <xs:list itemType="StatusGroup"/>
</xs:simpleType>

然后你可以通过jaxb轻松验证它(注意列表的分隔符是空格):

<Test StatusValue="X Y">
    <TestXSD>TestXSD</TestXSD>
    <xsd>xsd</xsd>
</Test>