如何使用 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。
我正在尝试动态注册 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。