apache-flex 如何使用SchemaTypeRegistry和SchemaManager从前缀和节点名中获取类定义?

enxuqcxy  于 2022-11-01  发布在  Apache
关注(0)|答案(1)|浏览(142)

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

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

但是我没有这个功能。我可以使用SchemaTypeRegistry使用示例或限定类名字符串来注册类型:

typeRegistry = SchemaTypeRegistry.getInstance();

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

然后,我可以很容易地获取该类并创建它的示例:

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

但是稍后,我在一个文本文档中,不要问为什么,好的,我在一个XML文本编辑器中,我可以得到XML节点名,在本例中,该值是“s:WindowedApplication”。
因此,现在当我尝试注册已知的命名空间URI时,我使用SchemaManager(在文档扩展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);

但是我遇到了这个问题。

问题1:

如果前缀“s”未在schemaManager中注册,或者没有前缀“WindowedApplication”与“s:WindowedApplication”,则schemaManager将引发错误。这是因为它需要一个架构,但数据类型是动态的,因此没有架构。

问题2:

SchemaTypeRegistry不知道名称空间前缀,SchemaManager也不知道它所拥有的名称空间的类定义,这让我相信我遗漏了一部分。
所以,假设我没有一个脆弱的,不连接的系统,有没有一个正式的或更好的方法来存储类定义,它们的命名空间和前缀?

更新日期:

如果没有别的办法,我可以扩展任何一个类,并从任何一个类添加代码,以连接类定义与名称空间和名称空间前缀。

idfiyjo8

idfiyjo81#

我必须创建自己的类来Map关系。
有两个ClassLoaderClassRegistry
ClassLoader加载flex-config.xml,它包含一个名称空间列表和这些名称空间中的类。ClassRegistry然后可以注册每个类。
这里有一个使用它的例子。

相关问题