Chris@0: Chris@0: * Chris@0: * For the full copyright and license information, please view the LICENSE Chris@0: * file that was distributed with this source code. Chris@0: */ Chris@0: Chris@0: namespace Symfony\Component\Serializer\Mapping\Loader; Chris@0: Chris@0: use Symfony\Component\Config\Util\XmlUtils; Chris@0: use Symfony\Component\Serializer\Exception\MappingException; Chris@0: use Symfony\Component\Serializer\Mapping\AttributeMetadata; Chris@0: use Symfony\Component\Serializer\Mapping\ClassMetadataInterface; Chris@0: Chris@0: /** Chris@0: * Loads XML mapping files. Chris@0: * Chris@0: * @author Kévin Dunglas Chris@0: */ Chris@0: class XmlFileLoader extends FileLoader Chris@0: { Chris@0: /** Chris@0: * An array of {@class \SimpleXMLElement} instances. Chris@0: * Chris@0: * @var \SimpleXMLElement[]|null Chris@0: */ Chris@0: private $classes; Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function loadClassMetadata(ClassMetadataInterface $classMetadata) Chris@0: { Chris@0: if (null === $this->classes) { Chris@0: $this->classes = $this->getClassesFromXml(); Chris@0: } Chris@0: Chris@0: if (!$this->classes) { Chris@0: return false; Chris@0: } Chris@0: Chris@0: $attributesMetadata = $classMetadata->getAttributesMetadata(); Chris@0: Chris@0: if (isset($this->classes[$classMetadata->getName()])) { Chris@0: $xml = $this->classes[$classMetadata->getName()]; Chris@0: Chris@0: foreach ($xml->attribute as $attribute) { Chris@0: $attributeName = (string) $attribute['name']; Chris@0: Chris@0: if (isset($attributesMetadata[$attributeName])) { Chris@0: $attributeMetadata = $attributesMetadata[$attributeName]; Chris@0: } else { Chris@0: $attributeMetadata = new AttributeMetadata($attributeName); Chris@0: $classMetadata->addAttributeMetadata($attributeMetadata); Chris@0: } Chris@0: Chris@0: foreach ($attribute->group as $group) { Chris@0: $attributeMetadata->addGroup((string) $group); Chris@0: } Chris@0: Chris@0: if (isset($attribute['max-depth'])) { Chris@0: $attributeMetadata->setMaxDepth((int) $attribute['max-depth']); Chris@0: } Chris@0: } Chris@0: Chris@0: return true; Chris@0: } Chris@0: Chris@0: return false; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Return the names of the classes mapped in this file. Chris@0: * Chris@0: * @return string[] The classes names Chris@0: */ Chris@0: public function getMappedClasses() Chris@0: { Chris@0: if (null === $this->classes) { Chris@0: $this->classes = $this->getClassesFromXml(); Chris@0: } Chris@0: Chris@0: return array_keys($this->classes); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Parses a XML File. Chris@0: * Chris@0: * @param string $file Path of file Chris@0: * Chris@0: * @return \SimpleXMLElement Chris@0: * Chris@0: * @throws MappingException Chris@0: */ Chris@0: private function parseFile($file) Chris@0: { Chris@0: try { Chris@0: $dom = XmlUtils::loadFile($file, __DIR__.'/schema/dic/serializer-mapping/serializer-mapping-1.0.xsd'); Chris@0: } catch (\Exception $e) { Chris@0: throw new MappingException($e->getMessage(), $e->getCode(), $e); Chris@0: } Chris@0: Chris@0: return simplexml_import_dom($dom); Chris@0: } Chris@0: Chris@0: private function getClassesFromXml() Chris@0: { Chris@0: $xml = $this->parseFile($this->file); Chris@17: $classes = []; Chris@0: Chris@0: foreach ($xml->class as $class) { Chris@0: $classes[(string) $class['name']] = $class; Chris@0: } Chris@0: Chris@0: return $classes; Chris@0: } Chris@0: }