2016-02-05 18 views
5

ho letto con successo uno schema XSD utilizzando org.eclipse.xsd.util.XSDResourceImpl ed elaborare tutti gli elementi XSD contenuti, tipi, attributi ecc
Ma quando voglio processare un riferimento a un elemento dichiarato nella lo schema importato, ottengo null come tipo. Sembra che gli schemi importati non vengano elaborati da XSDResourceImpl. Qualche idea?Leggi XSD utilizzando org.eclipse.xsd.util.XSDResourceImpl

final XSDResourceImpl rsrc = new XSDResourceImpl(URI.createFileURI(xsdFileWithPath)); 
    rsrc.load(new HashMap()); 
    final XSDSchema schema = rsrc.getSchema(); 
    ... 
    if (elem.isElementDeclarationReference()){ //element ref 
     elem = elem.getResolvedElementDeclaration(); 
    } 
    XSDTypeDefinition tdef = elem.getType(); //null for element ref 

Aggiornamento:
ho fatto il XSD importato non valida, ma ottenere non fa eccezione. Significa che non è davvero analizzato. C'è un modo per forzare il caricamento di XSD importato insieme a quello principale?

risposta

1

C'è un trucco importante per elaborare imports e includes automaticamente. Devi usare un ResourceSet per leggere il file XSD principale.

import org.eclipse.emf.ecore.resource.Resource; 
import org.eclipse.emf.ecore.resource.ResourceSet; 
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; 
import org.eclipse.xsd.util.XSDResourceFactoryImpl; 
import org.eclipse.xsd.util.XSDResourceImpl; 
import org.eclipse.xsd.XSDSchema; 

static ResourceSet resourceSet; 
XSDResourceFactoryImpl rf = new XSDResourceFactoryImpl(); 
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("xsd", rf); 
resourceSet = new ResourceSetImpl(); 
resourceSet.getLoadOptions().put(XSDResourceImpl.XSD_TRACK_LOCATION, Boolean.TRUE); 
XSDResourceImpl rsrc = (XSDResourceImpl)(resourceSet.getResource(uri, true)); 
XSDSchema sch = rsrc.getSchema(); 

Quindi prima di elaborare un elemento, un attributo o un gruppo del modello è necessario utilizzare questo:

elem = elem.getResolvedElementDeclaration(); 
attr = attr.getResolvedAttributeDeclaration(); 
grpdef = grpdef.getResolvedModelGroupDefinition(); 
0

Potrebbe provare qualcosa di simile, risolvere manualmente Tipo:

final XSDResourceImpl rsrc = new XSDResourceImpl(URI.createFileURI(xsdFileWithPath)); 
rsrc.load(new HashMap()); 
final XSDSchema schema = rsrc.getSchema(); 
for (Object content : schema.getContents()) 
{ 
    if (content instanceof XSDImport) 
    { 
     XSDImport xsdImport = (XSDImport) content; 
     xsdImport.resolveTypeDefinition(xsdImport.getNamespace(), ""); 
    } 
} 
0

Si può avere uno sguardo here. Particolarmente in questo metodo:

private static void forceImport(XSDSchemaImpl schema) { 
     if (schema != null) { 
      for (XSDSchemaContent content: schema.getContents()) { 
       if (content instanceof XSDImportImpl) { 
        XSDImportImpl importDirective = (XSDImportImpl)content; 
        schema.resolveSchema(importDirective.getNamespace()); 
       } 
      } 
     } 
    }