Re: [SOAP] xsd:choice maxOccurs=unbounded, and element order

From: Date: Wed, 23 May 2007 13:31:18 +0000
Subject: Re: [SOAP] xsd:choice maxOccurs=unbounded, and element order
References: 1 2 3 4  Groups: php.soap 
Request: Send a blank email to php-soap+get-2546@lists.php.net to get a copy of this message
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 >>>> >> >>

« previous php.soap (#2546) next »