Вопрос

Using the Xerces SAX library's XSModel as a representation of a XSD grammar, if I have a complex type referring to a model group, how can I retrieve the model group? It seems like the complex type definition as represented by the XSModel instance as provided by Xerces only provides access to the flattened (expanded) content of the group (p.e. the elements of the group), not the actual group or a reference to the group definition (or even the group's name; XSModelGroupImpl's getName()-method consists of return null ...).

Это было полезно?

Решение

Model groups are very well exposed by Xerces. But, you should rather use org.apache.xerces.xs package. The model groups are found in top-level declarations and as particles in complex types.

Here's a sample Java code:

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;
    }
  }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top