Re: [SOAP] xsd:choice maxOccurs=unbounded, and element order
| From: | Simon Detheridge | Date: | Thu, 24 May 2007 13:40:32 +0000 |
| Subject: | Re: [SOAP] xsd:choice maxOccurs=unbounded, and element order | ||
| References: | 1 2 3 4 5 | Groups: | php.soap |
| Request: | Send a blank email to php-soap+get-2547@lists.php.net to get a copy of this message | ||
Well, it looks like a bug to me. I've raised bug #41490 about it:
http://bugs.php.net/bug.php?id=41490
--
Simon Detheridge
SEN Developer, Widgit Software
Quoting Simon Detheridge <simon@widgit.com>:
> Actually the 'neat loophole' is a trick I stole from the official
> XHTML dtd. :-)
>
> Having said that, I can remove the <xsd:sequence> elements entirely,
> so my schema looks something like:
>
> <xsd:complexType name='containertype'>
> <xsd:choice maxOccurs='unbounded'>
> <xsd:element name='noun' type='nountype'>
> <xsd:element name='verb' type='verbtype'>
> <xsd:element name='other' type='othertype'>
> </xsd:choice>
> </xsd:complexType>
>
> The results are still the same. They elements come back grouped by type.
>
> I've just tested this with my app to make sure that this is the case.
>
> Simon
>
> --
> Simon Detheridge
> SEN Developer, Widgit Software
>
>
> Quoting "spooork@gmail.com" <spooork@gmail.com>:
>
>>
>> Thanks. That example makes it clearer.
>>
>> I guess the problem is that the choice overrides the sequence. With
>> the repeating choice element you can have any order and that's valid
>> even inside of the sequence.
>>
>> It is still inside a sequence though, so from the perspective of the
>> parser, no matter what order the repeating choice elements are in, the
>> parser should preserve that order. Neat loophole you found there!
>> You've found a way to make a sequence random! Have you looked at
>> putting in a tag other than sequence?
>>
>>
>>
>> On May 23, 2007, at 6:44 AM, Simon Detheridge wrote:
>>
>>> Quoting "spooork@gmail.com" <spooork@gmail.com>:
>>>
>>>> That structure is a bit confusing because of the repetition.
>>>> Technically you could have any series of e1 elements and e2 elements
>>> ...
>>>> Your choice tag makes that possible. Seeing that in a sequence tag
>>>> seems strange.
>>>
>>> Actually, that's exactly what I want.
>>>
>>> It's not really as simple as in my example. The content actually
>>> describes a document which is broken up into different data
>>> types, but have to occur in the correct order in order to make
>>> sense. Let's try an example closer to what I'm trying to do:
>>>
>>> Say, instead of elements e1 and e2, I have three: 'noun', 'verb',
>>> and 'other'. (Again, this is a simplification, I'm not actually
>>> trying to do that, but my real-world schema is quite complicated
>>> and this is a better example)
>>>
>>> Say my document then looks like:
>>>
>>> <container>
>>> <other>The</other>
>>> <noun>cat</noun>
>>> <other>is</other>
>>> <verb>playing</verb>
>>> <other>with</other>
>>> <noun>string</noun>
>>> </container>
>>>
>>> As far as I'm aware this is a perfectly OK thing to do with XML. I
>>> should be able to preserve my element order. (Hey, xhtml does
>>> stuff quite similar to this, right?)
>>>
>>> Unfortunately, when it gets to PHP, I'm left with the following:
>>>
>>> [container] => stdClass Object
>>> (
>>> [noun] Array
>>> (
>>> [0] => cat
>>> [1] => string
>>> )
>>> [other] Array
>>> (
>>> [0] => playing
>>> )
>>> [verb] Array
>>> (
>>> [0] => The
>>> [1] => is
>>> [2] => with
>>> )
>>> }
>>>
>>> My original document which read "The cat is playing with string",
>>> now reads "cat string playing The is with", which doesn't make
>>> sense.
>>>
>>> Also, I'm not really in a position to muck around with the schema.
>>> It's working in a couple of implementations. Dotnet (which
>>> unfortunately is what most people seem to want to use to talk to
>>> this thing) handles the above case fine. I really need something
>>> to happen at the PHP-client end, in order to make this work.
>>>
>>> I still think it looks like a bug.. ?
>>>
>>> Simon
>>>
>>> --
>>> Simon Detheridge
>>> SEN Developer, Widgit Software
>>>
>>>
>>> Quoting "spooork@gmail.com" <spooork@gmail.com>:
>>>
>>>>
>>>> That structure is a bit confusing because of the repetition.
>>>> Technically you could have any series of e1 elements and e2 elements
>>>> like this:
>>>>
>>>> <container>
>>>> <e2>different_other_stuff</e2>
>>>> <e1>some_stuff</e1>
>>>> <e2>different_other_stuff</e2>
>>>> <e1>some_stuff</e1>
>>>> <e2>different_other_stuff</e2>
>>>> <e2>different_stuff</e2>
>>>> <e2>different_other_stuff</e2>
>>>> <e1>some_stuff</e1>
>>>> <e1>some_other_stuff</e1>
>>>> <e1>some_stuff</e1>
>>>> <e2>different_other_stuff</e2>
>>>> <e2>different_other_stuff</e2>
>>>> <e1>some_stuff</e1>
>>>> <e2>different_other_stuff</e2>
>>>> </container>
>>>>
>>>> Your choice tag makes that possible. Seeing that in a sequence tag
>>>> seems strange. Perhaps you should not use the sequence. That says
>>>> that elements are ordered in a specific order. I don't know if the
>>>> choice tag interrupts that ordering. If the sequence applies then it's
>>>> going need to be like this in order to validate:
>>>>
>>>> <container>
>>>> <e1>some_stuff</e1>
>>>> <e1>some_stuff</e1>
>>>> <e1>some_stuff</e1>
>>>> <e1>some_other_stuff</e1>
>>>> <e1>some_stuff</e1>
>>>> <e1>some_stuff</e1>
>>>> <e2>different_other_stuff</e2>
>>>> <e2>different_other_stuff</e2>
>>>> <e2>different_other_stuff</e2>
>>>> <e2>different_stuff</e2>
>>>> <e2>different_other_stuff</e2>
>>>> <e2>different_other_stuff</e2>
>>>> <e2>different_other_stuff</e2>
>>>> <e2>different_other_stuff</e2>
>>>> </container>
>>>>
>>>> If there is a relationship between e1 and e2 and they have to appear as
>>>> a pair, then you might consider wrapping them in a complex type with a
>>>> sequence and just putting minOccurs=0 and maxOccurs="unbounded" on the
>>>> element of that type.
>>>>
>>>>
>>>>
>>>>
>>>> On May 23, 2007, at 4:32 AM, Simon Detheridge wrote:
>>>>
>>>>> Hi,
>>>>>
>>>>> Sorry for crossposting. I sent this to php-general yesterday,
>>>>> not realising there was a specific SOAP list...
>>>>>
>>>>> I'm trying to make PHP5's soap implementation play nice with my
>>>>> web service, and I'm
>>>>> having a problem.
>>>>>
>>>>> Part of my schema contains a complexType, containing an
>>>>> xsd:choice of several different
>>>>> element types, which can be repeated many times (maxOccurs=unbounded)
>>>>>
>>>>> e.g.:
>>>>>
>>>>> <xsd:complexType name='containertype'>
>>>>> <xsd:sequence>
>>>>> <xsd:choice maxOccurs='unbounded'>
>>>>> <xsd:element name='e1' type='e1type'>
>>>>> <xsd:element name='e2' type='e2type'>
>>>>> </xsd:choice>
>>>>> </xsd:sequence>
>>>>> </xsd:complexType>
>>>>>
>>>>> The problem is that the order of element here is important. I
>>>>> want the results returned
>>>>> in the same order that they appear in the XML.
>>>>>
>>>>> Unfortunately, what I end up with, is an object containing an
>>>>> array of all the e1
>>>>> elements, followed by an array of all the e2 elements.
>>>>>
>>>>> Take the following example... If there following were in my soap result:
>>>>>
>>>>> <container>
>>>>> <e1>some_stuff</e1>
>>>>> <e2>different_stuff</e2>
>>>>> <e1>some_other_stuff</e1>
>>>>> <e2>different_other_stuff</e2>
>>>>> </container>
>>>>>
>>>>> What I actually end up seeing is something like:
>>>>>
>>>>> [container] => stdClass Object
>>>>> (
>>>>> [e1] Array
>>>>> (
>>>>> [0] => some_stuff
>>>>> [1] => some_other_stuff
>>>>> )
>>>>> [e2] Array
>>>>> (
>>>>> [0] => different_stuff
>>>>> [1] => different_other_stuff
>>>>> )
>>>>> }
>>>>>
>>>>> Note that this is somewhat simplified from my real-world
>>>>> example. In reality, "e1" and
>>>>> "e2" are complexTypes themselves.
>>>>>
>>>>> But I really do need to see the resulting elements in the same
>>>>> order that they were
>>>>> supplied. I'm able to do this in dotnet and gsoap clients, so
>>>>> far. (I haven't tried any
>>>>> others.)
>>>>>
>>>>> Incidentally, I'm using a basic unmodified skeleton generated by
>>>>> wsdl2php as my classmap.
>>>>> The object describing the 'container' type looks simply like:
>>>>>
>>>>> class container {
>>>>> }
>>>>>
>>>>> Perhaps it's possible to add something to this to help sort the
>>>>> order out??
>>>>>
>>>>> Any suggestions are appreciated. Could this be a bug?
>>>>>
>>>>> Incidentally, the full-blown (and rather complicated I'm afraid)
>>>>> schema/wsdl for what I'm
>>>>> *actually* trying to do is at
>>>>> http://www.widgit.com/cml/symgate.wsdl if that
helps.
>>>>>
>>>>> Thanks,
>>>>> Simon
>>>>>
>>>>> --
>>>>> Simon Detheridge
>>>>> SEN Developer, Widgit Software
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> CONFIDENTIALITY NOTICE:
>>>>> This email and any attachments are for the exclusive and
>>>>> confidential use of the intended recipient. If you are not the
>>>>> intended recipient, please do not read, distribute or take
>>>>> action in reliance upon this message. If you have received
>>>>> this in error, please notify us immediately by return email
>>>>> and promptly delete this message and its attachments from
>>>>> your computer system.
>>>>>
>>>>> Logotron is a limited company registered in England, number
>>>>> 04113866. The registered office is Logotron Ltd, 124 Cambridge
>>>>> Science Park, Milton Road, Cambridge, CB4 0ZS.
>>>>>
>>>>> --
>>>>> PHP Soap Mailing List (http://www.php.net/)
>>>>> To unsubscribe, visit: http://www.php.net/unsub.php
>>>>>
>>>
>>>
>
> --
> PHP Soap Mailing List (http://www.php.net/)
> To unsubscribe, visit: http://www.php.net/unsub.php