如何使用 SchemaTypeRegistry 和 SchemaManager 从前缀和节点名称获取 class 定义?

How to get class definition from prefix and node name using SchemaTypeRegistry and SchemaManager?

我正在尝试动态注册 class 定义,以便我稍后可以解析 XML 文档,在正确的命名空间中获得正确的 class。我希望能够做到这一点:

var classObject:Object = typeRegistry.getClassDefinition("s:WindowedApplication");

但我没有。这就是我所在的位置。我可以使用实例或使用 SchemaTypeRegistry 的限定 class 名称字符串来注册类型:

typeRegistry = SchemaTypeRegistry.getInstance();

var windowedApplicationQName:QName = new QName(MXMLDocumentConstants.sparkNamespaceURI, "WindowedApplication");
//typeRegistry.registerClass(windowedApplicationQName, WindowedApplication);
typeRegistry.registerClass(windowedApplicationQName, "spark.components::WindowedApplication");

然后我可以获得 class 并足够轻松地创建它的实例:

var className:Object = typeRegistry.getClass(windowedApplicationQName);
var classInstance:Object;
classInstance  = new className();

但后来,我在一个文本文档中,不要问为什么,好的,我在 XML 文本编辑器中,我可以获得 XML 节点名称,在这种情况下,该值为 "s:WindowedApplication".

所以现在当我尝试注册已知的命名空间 URI 时,我正在使用 SchemaManager (not found in documentation extends QualifiedResourceManager 进行注册):

schemaManager = new SchemaManager();
schemaManager.addNamespaces({s:MXMLDocumentConstants.sparkNamespace});
var qname:QName = schemaManager.getQNameForPrefixedName("s:WindowedApplication");

这很棒,因为我可以获得 QName 对象,然后我可以像这样使用类型注册表搜索它:

qname = schemaManager.getQNameForPrefixedName("s:WindowedApplication");
var classObject:Object = typeRegistry.getClass(qname);

但是我遇到了这方面的问题。

问题一:
如果前缀 "s" 未在 schemaManager 中注册或没有前缀 "WindowedApplication" 与 "s:WindowedApplication",schemaManager 会抛出错误。这是因为它需要一个模式,但数据类型是动态的,所以没有。

问题二:
SchemaTypeRegistry 不知道命名空间前缀,SchemaManager 不知道它所拥有的命名空间的 class 定义。这让我相信我遗漏了一块。

所以假装我没有一个脆弱的、断开连接的系统是否有官方或更好的方法来存储 class 定义、它们的名称空间和前缀?

更新:
如果不出意外,我可以扩展 class 并从 class 添加代码以将 class 定义与名称空间和名称空间前缀连接起来。但是,又好像少了一块。

我不得不创建自己的 class 来映射关系。

有两个 ClassLoader and ClassRegistry

ClassLoader 加载 flex-config.xml。其中包含命名空间列表和这些命名空间中的 classes。 然后 ClassRegistry 可以注册每个 class。

有一个使用示例 here