#41490 [Opn]: xsd:choice with maxOccurs="unbounded" does not preserve element order
| From: | dmitry@php.net | Date: | Thu, 28 Jun 2007 10:19:13 +0000 |
| Subject: | #41490 [Opn]: xsd:choice with maxOccurs="unbounded" does not preserve element order | ||
| References: | 1 | Groups: | php.doc |
| Request: | Send a blank email to phpdoc+get-969376902@lists.php.net to get a copy of this message | ||
ID: 41490
Updated by: dmitry@php.net
Reported By: simon at highlyillogical dot org
Status: Open
-Bug Type: SOAP related
+Bug Type: Documentation problem
Operating System: Windows/Linux
PHP Version: 5.2.2
Assigned To: dmitry
New Comment:
There is no way to automatic preserve order of objects without breaking
compatibility, however as I showed, it is possible to do this with
sereral lines of additional code.
So nothing to fix (except documentation).
Previous Comments:
------------------------------------------------------------------------
[2007-06-28 08:31:40] simon at highlyillogical dot org
Yeah, I'm happy to write my own serialisers and deserialisers, to work
around the problem. (Although it's time consuming -- I don't have to do
this in other languages)
That 'typemap' trick doesn't seem to be documented anywhere or I'd have
gone with it straight away.
I haven't made it work in practice yet, but it looks like it should
work. I can implement my own complex classes and ensure that I
(de)serialize everything in the correct order.
------------------------------------------------------------------------
[2007-06-26 01:00:01] php-bugs at lists dot php dot net
No feedback was provided for this bug for over a week, so it is
being suspended automatically. If you are able to provide the
information that was originally requested, please do so and change
the status of the bug back to "Open".
------------------------------------------------------------------------
[2007-06-18 14:57:20] dmitry@php.net
You can access element order using the following trick.
<?php
$wsdl =
"http://zx81.highlyillogical.org/~simon/phpbugtest/phpbugtest.wsdl";
$options=Array(
'typemap' => array(array("type_ns" =>
"http://zx81.highlyillogical.org/~simon/phpbugtest",
"type_name" => "sentence",
"from_xml" => "sentence_from_xml"))
);
function sentence_from_xml($x) {
return simplexml_load_string($x);
}
$client = new SoapClient($wsdl, $options) ;
$result = $client->bugtest();
var_dump($result);
foreach ($result as $key => $val) {
echo $key . ":" . (string)$val . "\n";
}
Actual result:
--------------
object(SimpleXMLElement)#2 (3) {
["other"]=>
array(3) {
[0]=>
string(3) "The"
[1]=>
string(2) "is"
[2]=>
string(4) "with"
}
["noun"]=>
array(2) {
[0]=>
string(3) "cat"
[1]=>
string(6) "string"
}
["verb"]=>
string(7) "playing"
}
other:The
noun:cat
other:is
verb:playing
other:with
noun:string
------------------------------------------------------------------------
[2007-06-14 09:58:27] simon at highlyillogical dot org
In practice, that's not possible. The 'words' example is a
much-simplified example of what I want to happen. In reality my document
is a sequence of objects of different types, but must remain in the
correct order.
Think of an XHTML document. It's valid XML and could theoretically be
used in a similar way. However, in such a document you've got no idea
whether a <p> element, a <ul> element, a <div>, a <form>, or a <table>
is coming next... But they do have to have the order retained. If you
globbed all of the paragraps together, with all of the unordered lists
after, you'd end up with something that didn't make much sense.
In fact, if you look at the schema for XHTML
(http://www.w3.org/TR/xhtml1-schema/#xhtml1-strict) you can see that it
uses exactly this mechanism (xs:choice maxOccurs="unbounded") in order
to implement this. (See the "Block" complexType) -- So, if you want to
parse soap messages with an XHTML payload correctly, a solution to this
problem needs to be found.
------------------------------------------------------------------------
[2007-06-14 07:27:11] dmitry@php.net
I don's see a way to fix this. PHP is not able to keep several elemtns
with the same names in object or array. So it is not possible to keep
order of elements with different names.
You can probaly change WSDL to have a sequence of 'words', where each
word is an element defined as extension of type 'string' with
'part_of_speach' attribute. So you'll have to pass something like this:
<sentence>
<word part_of_speach="other">The</word>
<word part_of_speach="noun">cat</word>
<word part_of_speach="other">is</word>
<word part_of_speach="verb">playing</word>
<word part_of_speach="other">with</word>
<word part_of_speach="noun">string</word>
</sentence>
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
http://bugs.php.net/41490
--
Edit this bug report at http://bugs.php.net/?id=41490&edit=1