我有以下XSD:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="PaymentSearchRequest">
<xs:complexType>
<xs:sequence>
<xs:element name="User">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="Password" nillable="false">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="1" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="Key" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:string" />
</xs:simpleType>
</xs:element>
<xs:element name="Iteration" default="0000" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:short" />
</xs:simpleType>
</xs:element>
<xs:element name="ReturnUrl" minOccurs="0">
<xs:simpleType>
<xs:restriction base="xs:anyURI">
<xs:minLength value="1" />
<xs:pattern value="[hH][tT]{2}[pP]://[wW]{3}.*" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="PaymentSearch" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="SessionId">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="5" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="ConfirmationNumber" minOccurs="0" >
<xs:simpleType>
<xs:restriction base="xs:string" />
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
这对我们旧的业务逻辑很好。并且验证了以下XML:
<PaymentSearchRequest>
<User>test@example.com</User>
<Password>test@1</Password>
<PaymentSearch>
<SessionId>79C14E66-87E1-42BD-9974-096E2D037D22</SessionId>
<ConfirmationNumber />
</PaymentSearch>
</PaymentSearchRequest>
现在我需要满足以下场景:
1)
<PaymentSearchRequest>
<User>test@example.com</User>
<Password>test@1</Password>
<PaymentSearch>
<ConfirmationNumber>HUS73945KJAF</ConfirmationNumber>
</PaymentSearch>
</PaymentSearchRequest>
2)
<PaymentSearchRequest>
<User>test@example.com</User>
<Password>test@1</Password>
<PaymentSearch>
<SessionId>79C14E66-87E1-42BD-9974-096E2D037D22</SessionId>
</PaymentSearch>
</PaymentSearchRequest>
3)
<PaymentSearchRequest>
<User>test@example.com</User>
<Password>test@1</Password>
<PaymentSearch>
<SessionId>79C14E66-87E1-42BD-9974-096E2D037D22</SessionId>
<ConfirmationNumber>AJKF3894KJ3425</ConfirmationNumber>
</PaymentSearch>
</PaymentSearchRequest>
到目前为止我尝试了什么:
选择元素 对于第三种情况,选择元素方法失败了。
答案 0 :(得分:1)
使用PaymentSearch
的以下xsd并成功验证您发布的所有3种可能的<xs:element name="PaymentSearch" maxOccurs="unbounded">
<xs:complexType>
<xs:choice minOccurs="1" maxOccurs="unbounded">
<xs:element name="SessionId">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="5" />
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="ConfirmationNumber">
<xs:simpleType>
<xs:restriction base="xs:string" />
</xs:simpleType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
方案:
maxOccurs
如果xs:choice
和2
中的每一个只能出现一次,那么您可以将ConfirmationNumber
的{{1}}更改为SessionId
(这样两者的最大出现次数就是2
)。