/** * * @param \SimpleXmlElement $xml * @param object $obj * * @throws \Exception */ private function appendObjectProperties(\SimpleXMLElement $xml, $obj) { $clsMeta = new ClassMetadata($obj, $this->configuration); foreach ($clsMeta->getProperties() as $prop) { $propName = $prop->getName(); $nodeName = "xmlns:" . $prop->getXmlNodeName(); $value = $obj->{$propName}; if (is_object($value)) { $this->appendObjectProperties($xml->addChild($nodeName), $value); } elseif (is_string($value) && $prop->isScalarValue()) { $xml[0] = $value; } elseif (is_string($value) && $prop->isAttribute()) { $xml->addAttribute($prop->getName(), $value); } elseif (is_string($value)) { $xml->addChild($nodeName, $value); } elseif ((is_int($value) || is_float($value)) && $prop->isScalarValue()) { $xml[0] = (string) $value; } elseif (is_null($value)) { continue; } elseif (is_array($value)) { if (count($value) == 0) { continue; } foreach ($value as $itemValue) { if (is_object($itemValue)) { $this->appendObjectProperties($xml->addChild($nodeName), $itemValue); } else { throw new \Exception("Failed to serialize. Only object node arrays supported"); } } } else { throw new \Exception("Not implemented yet. Prop: {$propName} cannot be converted to xml node"); } } }