XML 枚举列表的属性验证

XML Attribute Validation from Enumeration List

我有一个 XML,我需要使用 XSD 在架构中使用枚举类型验证属性值。

样本XML:

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

以上我需要验证属性值 X 和 Y 是我的架构枚举列表的一部分。

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

更新:

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轻松验证它(注意列表的分隔符是space):

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