Просмотр исходного кода

fixed bug in parse xsd type for field

Piotr Labudda 8 лет назад
Родитель
Сommit
d1971b0afe
1 измененных файлов с 14 добавлено и 7 удалено
  1. 14 7
      SE/se-lib/XML.php

+ 14 - 7
SE/se-lib/XML.php

@@ -108,8 +108,9 @@ class XML {
 			// TODO:TYPE_RECURCE: if local ns prefix then find correct typeName?
 			// TODO:TYPE_RECURCE:the same for restrictions
 			$type = $nodeArray[1]['type'];
-			if ('xs:' == substr($type, 0, 3)) return "xsd:" . substr($type, 3);
-			if ('xsd:' == substr($type, 0, 4)) return $type;
+			DBG::log(['is_xs:' => ('xs:' === substr($type, 0, 3)), 'is_xsd:'=>('xsd:' === substr($type, 0, 4))], 'array', "DBG: findElementType field({$fieldName}) type({$type})");
+			if ('xs:' === substr($type, 0, 3)) return "xsd:" . substr($type, 3);
+			if ('xsd:' === substr($type, 0, 4)) return $type;
 			list($prefix, $name) = explode(':', $type);
 			if ($prefix === self::findTargetNamespacePrefix($docArray)) {
 				$simpleTypeNode = self::findSimpleTypeNode($docArray, $name);
@@ -133,8 +134,8 @@ class XML {
 					if ($isEnum) return 'p5:enum';
 
 					// TODO: recurse with limit
-					if ('xs:' == substr($type, 0, 3)) return "xsd:" . substr($type, 3);
-					if ('xsd:' == substr($type, 0, 4)) return $type;
+					if ('xs:' === substr($type, 0, 3)) return "xsd:" . substr($type, 3);
+					if ('xsd:' === substr($type, 0, 4)) return $type;
 					list($prefix, $name) = explode(':', $type);
 					$simpleTypeNode = self::findSimpleTypeNode($docArray, $name);
 					DBG::log($simpleTypeNode, 'array', "\$simpleTypeNode \$fieldName='{$fieldName}' ... type='{$type}'");
@@ -146,8 +147,7 @@ class XML {
 						if (empty($restrictionNode[1]['base'])) throw new Exception("Missing xsd:restriction/@base (node/@type => xsd:simpleType/[@type='{$simpleTypeNode[1]['type']}']/xsd:restriction')");
 						$type = $restrictionNode[1]['base'];
 						DBG::log($type, 'array', "findElementType \$fieldName='{$fieldName}' ... type='{$type}'");
-						if ('xs:' == substr($type, 0, 3)) return "xsd:" . substr($type, 3);
-						if ('xsd:' == substr($type, 0, 4)) return $type;
+						return self::convertXsdTypeToXsdPrefix($type);
 					}
 					// TODO: throw...
 				}
@@ -179,7 +179,14 @@ class XML {
 		if (empty($nodeArray[2][0][0]) || !self::isXsdTag($nodeArray[2][0][0], 'simpleType')) throw new Exception("Missing 'xsd:simpleType' for field '{$fieldName}'");
 		if (empty($nodeArray[2][0][2][0]) || !self::isXsdTag($nodeArray[2][0][2][0][0], 'restriction')) throw new Exception("Missing 'xsd:restriction' for field '{$fieldName}'");
 		if (empty($nodeArray[2][0][2][0][1]['base'])) throw new Exception("Missing 'xsd:restriction/@base' for field '{$fieldName}'");
-		return $nodeArray[2][0][2][0][1]['base'];
+		return self::convertXsdTypeToXsdPrefix($nodeArray[2][0][2][0][1]['base']);
+	}
+
+	public static function convertXsdTypeToXsdPrefix($type) {
+		// TODO: validate if type is supported in object engine and gui
+		if ('xs:' === substr($type, 0, 3)) return "xsd:" . substr($type, 3);
+		if ('xsd:' === substr($type, 0, 4)) return $type;
+		throw new Exception("Not implemented type '{$type}'");
 	}
 
 	public static function findElementRestrictions($docArray, $nodeArray) {