2016-12-11 11 views
2

Я пытаюсь зарегистрировать определения классов динамически, так что я могу проанализировать XML-документ позже, чтобы получить правильный класс в правильном пространстве имен. Я хочу, чтобы это было сделано:Как получить определение класса из префикса и имени узла с помощью SchemaTypeRegistry и SchemaManager?

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 не имеет знания определений классов из пространства имен в ней хранится. Это приводит меня к мысли, что есть часть, которую мне не хватает.

Так что притворяясь, что у меня нет хрупкой, отключенной системы, есть официальный или лучший способ хранения определений классов, их пространств имен и префиксов?

Update:
Если ничего другого я не мог продлить либо класс и добавить код из любого класса, чтобы соединить определения класса с пространством имен и префиксов. Но опять же, кажется, что кусок пропал.

ответ

0

Мне пришлось создать свой собственный класс для сопоставления отношений.

Есть два ClassLoader и ClassRegistry.

ClassLoader загружает flex-config.xml. Это содержит список пространств имен и классов в этих пространствах имен. ClassRegistry может регистрировать каждый класс.

Существует пример использования here.