23 $this->data = new \SplObjectStorage();
35 $this->contentType = $header;
42 $xml = isset($this->data[$command])
43 ? $this->data[$command]
45 $this->
addXml($xml, $param, $value);
47 $this->data[$command] = $xml;
55 if (isset($this->data[$command])) {
57 unset($this->data[$command]);
60 $operation = $command->getOperation();
61 if ($operation->getData(
'xmlAllowEmpty')) {
69 if ($this->contentType && !$request->
hasHeader(
'Content-Type')) {
70 $request->
setHeader(
'Content-Type', $this->contentType);
72 $request->setBody($xml);
85 static $defaultRoot = array(
'name' =>
'Request');
87 $root = $operation->getData(
'xmlRoot') ?: $defaultRoot;
89 $encoding = $operation->getData(
'xmlEncoding');
93 $xmlWriter->startElement($root[
'name']);
95 if (!empty($root[
'namespaces'])) {
97 foreach ((array) $root[
'namespaces'] as $prefix => $uri) {
99 if (!is_numeric($prefix)) {
100 $nsLabel .=
':'.$prefix;
102 $xmlWriter->writeAttribute($nsLabel, $uri);
115 protected function addXml(\XMLWriter $xmlWriter, Parameter $param, $value)
117 if ($value ===
null) {
121 $value = $param->filter($value);
122 $type = $param->getType();
123 $name = $param->getWireName();
125 $namespace = $param->getData(
'xmlNamespace');
126 if (
false !== strpos($name,
':')) {
127 list($prefix, $name) = explode(
':', $name, 2);
130 if ($type ==
'object' || $type ==
'array') {
131 if (!$param->getData(
'xmlFlattened')) {
132 $xmlWriter->startElementNS(
null, $name, $namespace);
134 if ($param->getType() ==
'array') {
136 } elseif ($param->getType() ==
'object') {
139 if (!$param->getData(
'xmlFlattened')) {
140 $xmlWriter->endElement();
144 if ($param->getData(
'xmlAttribute')) {
145 $this->
writeAttribute($xmlWriter, $prefix, $name, $namespace, $value);
147 $this->
writeElement($xmlWriter, $prefix, $name, $namespace, $value);
160 protected function writeAttribute($xmlWriter, $prefix, $name, $namespace, $value)
162 if (empty($namespace)) {
163 $xmlWriter->writeAttribute($name, $value);
165 $xmlWriter->writeAttributeNS($prefix, $name, $namespace, $value);
178 protected function writeElement(\XMLWriter $xmlWriter, $prefix, $name, $namespace, $value)
180 $xmlWriter->startElementNS($prefix, $name, $namespace);
181 if (strpbrk($value,
'<>&')) {
182 $xmlWriter->writeCData($value);
184 $xmlWriter->writeRaw($value);
186 $xmlWriter->endElement();
198 $xmlWriter = new \XMLWriter();
199 $xmlWriter->openMemory();
200 $xmlWriter->startDocument(
'1.0', $encoding);
214 $xmlWriter->endDocument();
216 return $xmlWriter->outputMemory();
225 foreach ($value as $v) {
226 $this->
addXml($xmlWriter, $items, $v);
236 $noAttributes = array();
238 foreach ($value as $name => $v) {
240 if ($property->getData(
'xmlAttribute')) {
241 $this->
addXml($xmlWriter, $property, $v);
243 $noAttributes[] = array(
'value' => $v,
'property' => $property);
248 foreach ($noAttributes as $element) {
249 $this->
addXml($xmlWriter, $element[
'property'], $element[
'value']);