如果序列xsd中存在任何一个元素,则验证xml

时间:2015-06-08 12:25:43

标签: xml xsd

我有以下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>

到目前为止我尝试了什么:

选择元素 对于第三种情况,选择元素方法失败了。

1 个答案:

答案 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:choice2中的每一个只能出现一次,那么您可以将ConfirmationNumber的{​​{1}}更改为SessionId(这样两者的最大出现次数就是2)。