Re: validating soap requests

Antňnia Galmés writes:

> Hi!
> 
> I have a problem writing an schema. We have developed a
> XML interface that accepts the requests to our system
> using SOAP (but it's use is optional).  The xml
> requests are grouped with the tag
> <requests_set>... </requests_set> and may be more than
> one. The request as a whole would be:
> 
> <?xml version="1.0" encoding="UTF-8" ?>
> <SOAP-ENV:Envelope
> xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
> SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
> <SOAP-ENV:Body>
> 
>      <requests_set>
>          <request1>
>              ...
>          </request1>
>               .
>               .
>               .
>      </requests_set>
> 
> </SOAP-ENV:Body>
> </SOAP-ENV:Envelope>
> 
> I have written an schema to validate the incoming
> requests, starting from the complex type
> "requests_set". The validation is ok if I don't write
> the outer SOAP tags, but I get a validating error when
> the requests come into the soap-env:body tag because
> this does not appear in my schema. The problem is that
> I don't know how to include the soap elements in the
> schema I've written. Now, the schema is starting like
> this:
> 
> <?xml version="1.0" encoding="UTF-8"?>
> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
> elementFormDefault="qualified" >
>      <xsd:element name="requests_set" type="aux_type"/>
>      <xsd:complexType name="aux_type">
>          <xsd:sequence>
>              <xsd:element name="request1" type="t1" minOccurs="0"
> maxOccurs="unbounded"/>
>              <xsd:element name="request2" type="t2" minOccurs="0"
> maxOccurs="unbounded"/> etc.
> 
> How do I indicate that the "requests_set" may be in a
> SOAP block?
> 
> Thank you in advance. 

This is mostly a question about XML schema, of course, not SOAP.  The 
fundamental answer is that the XML schema recommendation anticipates such 
needs in a variety of ways >>but you have to get a schema validator that 
meets your needs<<.  What the schema recommendation says essentially is: 
according to the needs of an application, processors MAY allow validity 
assessment to begin with any element in the instance, and using any 
complexType definition or element declaration.  Now, processors don't have 
to allow such great flexibility, but they're allowed to. 

So, the question is, what does the processor you're using do, and what 
might others do?  Most processors out there are aimed at the obvious 
"validate the whole document based on the declaration of the root element 
scenario."  I'm honestly not sure which ones if any allow you a finer 
degree of control, but in principle it's allowed.

There is another technique that is often used to solve this problem.  If 
you look at the schema for SOAP at [2] it contains:

<xs:complexType name="Body">

  <xs:sequence>
    <xs:any namespace="##any" minOccurs="0" maxOccurs="unbounded" 
processContents="lax" /> 
  </xs:sequence>

  <xs:anyAttribute namespace="##any" processContents="lax">
    <xs:annotation>
      <xs:documentation>
         Prose in the spec does not specify that 
         attributes are allowed on the Body element
      </xs:documentation> 
    </xs:annotation>
  </xs:anyAttribute>
</xs:complexType>

If you note the processContents="lax", that means that the schema processor will validate the body if and only 
if an element declaration is provided for the particular body element 
child you provide.  In your case, this is "requests_set".  So, if you 
provide a schema processor with both the schema for the SOAP envelope and 
for your schema for requests_set, which are presumably in separate schema 
documents, then the validation should occur.  Exactly how to provide such 
multiple documents, if it's possible at all, depends on the API or command 
line options to the processor you are using. 

One other suggestion: it's really better practice to use namespace 
qualification on elements like "requests_set".  That will help your SOAP 
message stand out from any others that might use an otherwise similar 
element name.

I hope this is helpful to you. 

Noah

[1] http://www.w3.org/TR/xmlschema-1/#validation_outcome
[2] http://schemas.xmlsoap.org/soap/envelope/ 

------------------------------------------------------------------
Noah Mendelsohn                              Voice: 1-617-693-4036
IBM Corporation                                Fax: 1-617-693-8676
One Rogers Street
Cambridge, MA 02142
------------------------------------------------------------------

Received on Friday, 27 December 2002 10:41:08 UTC