我有一个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
答案 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>