我正在尝试动态注册类定义,以便以后解析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也不知道它所拥有的名称空间的类定义,这让我相信我遗漏了一部分。
所以,假设我没有一个脆弱的,不连接的系统,有没有一个正式的或更好的方法来存储类定义,它们的命名空间和前缀?
更新日期:
如果没有别的办法,我可以扩展任何一个类,并从任何一个类添加代码,以连接类定义与名称空间和名称空间前缀。
1条答案
按热度按时间idfiyjo81#
我必须创建自己的类来Map关系。
有两个ClassLoader和ClassRegistry。
ClassLoader加载flex-config.xml,它包含一个名称空间列表和这些名称空间中的类。ClassRegistry然后可以注册每个类。
这里有一个使用它的例子。