如何使用 SchemaTypeRegistry 和 SchemaManager 从前缀和节点名称中获取类定义?
Posted
技术标签:
【中文标题】如何使用 SchemaTypeRegistry 和 SchemaManager 从前缀和节点名称中获取类定义?【英文标题】:How to get class definition from prefix and node name using SchemaTypeRegistry and SchemaManager? 【发布时间】:2017-04-26 08:54:38 【问题描述】:我正在尝试动态注册类定义,以便以后可以解析 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】:我必须创建自己的类来映射关系。
有两个ClassLoader 和ClassRegistry。
ClassLoader 加载 flex-config.xml。其中包含这些名称空间中的名称空间和类的列表。 ClassRegistry 然后可以注册每个类。
有一个使用here的例子。
【讨论】:
以上是关于如何使用 SchemaTypeRegistry 和 SchemaManager 从前缀和节点名称中获取类定义?的主要内容,如果未能解决你的问题,请参考以下文章