/** * @param string $file * @param XSDMap $xsdMap * @param string $outputNS */ public static function parseClassesFromXSD($file, XSDMap $xsdMap, $outputNS) { $sxe = self::constructSXEWithFilePath($file); foreach ($sxe->children('xs', true) as $child) { /** @var \SimpleXMLElement $child */ $attributes = $child->attributes(); $fhirElementName = (string) $attributes['name']; if ('' === $fhirElementName) { continue; } if (ElementTypeEnum::COMPLEX_TYPE === strtolower($child->getName())) { $type = ClassTypeUtils::getComplexClassType($child); $xsdMap[$fhirElementName] = new XSDMap\XSDMapEntry($child, $fhirElementName, NSUtils::generateRootNamespace($outputNS, NSUtils::getComplexTypeNamespace($fhirElementName, $type)), NameUtils::getComplexTypeClassName($fhirElementName)); } } }
/** * @param XSDMap $XSDMap * @param XSDMap\XSDMapEntry $mapEntry * @return ClassTemplate */ public static function buildFHIRElementClassTemplate(XSDMap $XSDMap, XSDMap\XSDMapEntry $mapEntry) { $classTemplate = new ClassTemplate($mapEntry->fhirElementName, $mapEntry->className, $mapEntry->namespace, ClassTypeUtils::getComplexClassType($mapEntry->sxe)); foreach ($mapEntry->sxe->children('xs', true) as $_element) { /** @var \SimpleXMLElement $_element */ switch (strtolower($_element->getName())) { case ElementTypeEnum::ATTRIBUTE: case ElementTypeEnum::CHOICE: case ElementTypeEnum::SEQUENCE: case ElementTypeEnum::UNION: PropertyGenerator::implementProperty($XSDMap, $classTemplate, $_element); break; case ElementTypeEnum::ANNOTATION: $classTemplate->setDocumentation(XMLUtils::getDocumentation($_element)); break; case ElementTypeEnum::COMPLEX_TYPE: self::parseComplexType($XSDMap, $_element, $classTemplate); break; case ElementTypeEnum::COMPLEX_CONTENT: self::parseComplexContent($XSDMap, $_element, $classTemplate); break; case ElementTypeEnum::SIMPLE_TYPE: self::parseSimpleType($XSDMap, $_element, $classTemplate); break; case ElementTypeEnum::SIMPLE_CONTENT: self::parseSimpleContent($XSDMap, $_element, $classTemplate); break; case ElementTypeEnum::RESTRICTION: self::parseRestriction($XSDMap, $_element, $classTemplate); break; case ElementTypeEnum::EXTENSION: self::parseExtension($XSDMap, $_element, $classTemplate); break; } } self::addBaseClassProperties($classTemplate, $mapEntry); foreach ($classTemplate->getProperties() as $propertyTemplate) { MethodGenerator::implementMethodsForProperty($classTemplate, $propertyTemplate); } self::addBaseClassInterfaces($classTemplate); self::addBaseClassMethods($classTemplate); return $classTemplate; }