public function build($requestType, $rootName, $callback = NULL) { $doc = new DOMDocument("1.0", "UTF-8"); $rootElement = $doc->createElement($rootName); if ($callback) { call_user_func_array($callback, [&$rootElement]); } $doc->appendChild($rootElement); $requestType = $this->repository->findTypeByName($requestType); if ($requestType) { $requestType->render($this->repository, $doc, $rootElement, [Helpers::cleanNamespace($rootName)]); } return $doc->saveXML(); }
protected function parseComplexTypes(TypesRepositoryInterface $repo) { foreach ($this->parseXPath('/xs:schema/xs:complexType') as $complex_type) { $name = $complex_type->getAttribute('name'); $elementNodes = $this->parseXPath($complex_type->getNodePath() . '/xs:sequence/xs:element'); $elements = []; foreach ($elementNodes as $element) { $elName = $element->getAttribute('name'); $elType = NULL; $elComplexType = $element->getAttribute('type'); $elSimpleType = $this->parseXPath($element->getNodePath() . '/xs:simpleType/xs:restriction', 'base'); if ($elComplexType) { $elType = $elComplexType; } elseif (count($elSimpleType)) { $elType = $elSimpleType[0]; } else { $elType = "UnknownType"; } $min_occurs = $element->getAttribute('minOccurs'); $max_occurs = $element->getAttribute('maxOccurs'); $elements[$elName] = new Element(['elementName' => $elName, 'type' => Helpers::cleanNamespace($elType), 'min_occurs' => $min_occurs, 'max_occurs' => $max_occurs]); } $xsd_type = new ComplexType(['name' => $name, 'elements' => $elements]); $repo->registerType($name, $xsd_type); } }