2016-12-11 1 views
2

XML 문서를 구문 분석하여 나중에 올바른 네임 스페이스에서 올바른 클래스를 얻을 수 있도록 클래스 정의를 동적으로 등록하려고합니다. 나는 이것을 할 수 있고 싶다 :SchemaTypeRegistry와 SchemaManager를 사용하여 접두사와 노드 이름에서 클래스 정의를 얻는 방법?

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

나는 그것이 없다. 여기 내가있는 곳이야.

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(); 

하지만 나중에 내가 SchemaTypeRegistry를 사용하여 인스턴스 또는 클래스 이름 문자열을 사용하여 유형을 등록 할 수 있어요 on, 나는 텍스트 문서 안에있다. 이유는 묻지 않는다. XML 문서 편집기에있다. XML 노드 이름을 얻을 수있다.이 경우 값은 "WindowedApplication"이다.

그래서 지금은 알려진 이름 공간 URI의 등록하려고 해요 때 나는 SchemaManager (문서에서 찾을 수없는이 QualifiedResourceManager를 확장)에 것을하고 있어요 : 나는의 QName를 얻을 수 있기 때문에

schemaManager = new SchemaManager(); 
schemaManager.addNamespaces({s:MXMLDocumentConstants.sparkNamespace}); 
var qname:QName = schemaManager.getQNameForPrefixedName("s:WindowedApplication"); 

이 중대하다 개체 및 그런 다음 형식 레지스트리를 사용하여 검색 할 수 있습니다.

qname = schemaManager.getQNameForPrefixedName("s:WindowedApplication"); 
var classObject:Object = typeRegistry.getClass(qname); 

그러나이 문제가 발생했습니다.

문제 1 : 접두어 경우
은 "S"는 schemaManager에 등록되어 있지 않은 또는 접두사 "WindowedApplication는"대 없다 "S : WindowedApplication"는 상기 schemaManager 오류가 발생. 이는 스키마를 예상하고 있기 때문에 데이터 유형이 동적이어서 하나도 존재하지 않기 때문입니다.

문제 2 :
SchemaTypeRegistry 네임 스페이스 접두사의 지식이없고 SchemaManager는 보유하고있는 네임 스페이스의 클래스 정의에 대한 지식이 없습니다. 이것은 나가 놓치는 조각이다는 것을 나를 믿게한다.

그래서 내가 연약하고 단절된 시스템을 사용하지 않는 것은 클래스 정의, 네임 스페이스 및 접두어를 저장하는 공식 또는 더 나은 방법이 있습니까?

업데이트 :
다른 아무것도 나도 클래스를 확장하지 않으며 네임 스페이스와 네임 스페이스 접두사와 클래스 정의를 연결하거나 클래스에서 코드를 추가 할 수 있다면. 하지만 다시 한 번 빠진 부분이있는 것 같습니다.

답변

0

관계를 매핑하기 위해 고유 한 클래스를 만들어야했습니다.

두 개의 ClassLoaderClassRegistry이 있습니다.

ClassLoader는 flex-config.xml을로드합니다. 여기에는 해당 네임 스페이스의 네임 스페이스 및 클래스 목록이 포함됩니다. ClassRegistry는 각 클래스를 등록 할 수 있습니다.

사용 예는 here입니다.

관련 문제