2013-11-02 2 views
1

Использование библиотеки Xerces SAX XSModel в качестве представления грамматики XSD, если у меня есть сложный тип, относящийся к группе моделей, как я могу получить группу модели? Похоже, что определение сложного типа, представленное экземпляром XSModel, предоставленное Xerces, обеспечивает доступ к сплющенному (расширенному) содержимому группы (pe элементы группы), а не к фактической группе или ссылке на определение группы (или даже имя группы; XSModelGroupImplgetName()-метод состоит из return null ...).XSModel: получение информации о группе моделей

ответ

5

Группы моделей очень хорошо представлены Xerces. Но вы должны использовать пакет org.apache.xerces.xs. Группы моделей находятся в объявлениях верхнего уровня и как частицы в сложных типах.

Вот пример кода Java:

import org.apache.xerces.xs.*; 
import org.apache.xerces.dom.DOMXSImplementationSourceImpl; 
.... 

/** 
* Load an XSD file 
*/ 
void loadSchema (String xsdURI) 
{ 
    XSImplementation impl = (XSImplementation) 
    (new DOMXSImplementationSourceImpl()).getDOMImplementation ("XS-Loader"); 

    XSLoader schemaLoader = impl.createXSLoader (null); 

    XSModel xsModel = schemaLoader.loadURI (xsdURI); 
} 

/** 
* Process schema content 
*/ 
private void processXSModel (XSModel xsModel) 
{ 
    XSNamedMap xsMap; 

    // process model group definitions 
    xsMap = xsModel.getComponents (XSConstants.MODEL_GROUP_DEFINITION); 
    for (int i = 0; i < xsMap.getLength(); i ++) 
    { 
    XSModelGroupDefinition xsGroupDef = (XSModelGroupDefinition) xsMap.item (i); 
    XSModelGroup xsGroup = xsGroupDef.getModelGroup(); 
    ... 
    } 

    // process top-level type definitions 
    xsMap = xsModel.getComponents (XSConstants.TYPE_DEFINITION); 
    for (int i = 0; i < xsMap.getLength(); i ++) 
    { 
    XSTypeDefinition xsTDef = (XSTypeDefinition) xsMap.item (i); 
    processXSTypeDef (xsTDef); 
    } 

    // process top-level element declarations 
    xsMap = xsModel.getComponents (XSConstants.ELEMENT_DECLARATION); 
    for (int i = 0; i < xsMap.getLength(); i ++) 
    { 
    XSElementDeclaration xsElementDecl = (XSElementDeclaration) xsMap.item (i); 
    processXSElementDecl (xsElementDecl); 
    } 
} 

/** 
* Process type definition 
*/ 
private void processXSTypeDef (XSTypeDefinition xsTDef) 
{ 
    switch (xsTDef.getTypeCategory()) 
    { 
    case XSTypeDefinition.SIMPLE_TYPE: 

     processXSSimpleType ((XSSimpleTypeDefinition) xsTDef); 
     break; 

    case XSTypeDefinition.COMPLEX_TYPE: 

     XSComplexTypeDefinition xsCTDef = (XSComplexTypeDefinition) xsTDef; 

     // element's attributes 
     XSObjectList xsAttrList = xsCTDef.getAttributeUses(); 
     for (int i = 0; i < xsAttrList.getLength(); i ++) 
     { 
     processXSAttributeUse ((XSAttributeUse) xsAttrList.item (i)); 
     } 

     // element content 
     switch (xsCTDef.getContentType()) 
     { 
     case XSComplexTypeDefinition.CONTENTTYPE_EMPTY: 

      break; 

     case XSComplexTypeDefinition.CONTENTTYPE_SIMPLE: 

      parseValueType (xsCTDef.getSimpleType()); 
      break; 

     case XSComplexTypeDefinition.CONTENTTYPE_ELEMENT: 

      processXSParticle (xsCTDef.getParticle()); 
      break; 

     case XSComplexTypeDefinition.CONTENTTYPE_MIXED: 

      ... 
      processXSParticle (xsCTDef.getParticle()); 
      break; 
     } 
     } 

     break; 
    } 

    /** 
    * Process particle 
    */ 
    private void processXSParticle (XSParticle xsParticle) 
    { 
    XSTerm xsTerm = xsParticle.getTerm(); 
    switch (xsTerm.getType()) 
    { 
     case XSConstants.ELEMENT_DECLARATION: 

     processXSElementDecl ((XSElementDeclaration) xsTerm); 
     break; 

     case XSConstants.MODEL_GROUP: 

     // this is one of the globally defined groups 
     // (found in top-level declarations) 

     XSModelGroup xsGroup = (XSModelGroup) xsTerm; 

     // it also consists of particles 
     XSObjectList xsParticleList = xsGroup.getParticles(); 
     for (int i = 0; i < xsParticleList.getLength(); i ++) 
     { 
      processXSParticle ((XSParticle) xsParticleList.item (i)); 
     } 

     ... 
     break; 

     case XSConstants.WILDCARD: 

     ... 
     break; 
    } 
    } 
Смежные вопросы