Найти элементы, которые можно повторить в XML-схеме, используя Java

Я хочу вывести из схемы XML пару (parentTag, childTag) так что это разрешено для parentTag содержать несколько экземпляров childTag как прямые дети.

Делая это вручную, я ищу maxOccurs атрибут в схеме, посмотрите тег элемента и тег прямого родителя.

Например, из

<xs:complexType name="aType">
     <xs:sequence>
          <xs:element ref="B" maxOccurs="unbounded"/>
     </xs:sequence>
</xs:complexType>

<xs:element name="A" type="aType">
<xs:element name="ANOTHER" type="aType">

Я должен получить пары (A,B) а также (ANOTHER,B),

У меня есть рабочее решение, использующее XSLT для преобразования моей схемы в список таких (parentTag, childTag) пары.

Есть ли элегантный способ сделать это на Java? Какую библиотеку вы бы порекомендовали реализовать?

1 ответ

Решение

Для обработки XML-схем в Java (без XSLT) мы используем Xerces2 Java Parser: http://xerces.apache.org/xerces2-j/

Могут потребоваться следующие пакеты / классы:

import org.w3c.dom.*;
import org.apache.xerces.xs.*;
import org.apache.xerces.dom.DOMXSImplementationSourceImpl;
import org.apache.xerces.impl.xs.util.StringListImpl;
import org.apache.xerces.util.XMLCatalogResolver;

Затем обработка файла XSD происходит следующим образом:

// Obtain the XML Schema implementation
XSImplementation impl = (XSImplementation)
  (new DOMXSImplementationSourceImpl()).getDOMImplementation(XMLConstants.XSD_LOADER_NAME);

// Get schema loader
XSLoader schemaLoader = impl.createXSLoader (null);

// Optional. Specify error handler
DOMErrorHandler errorHandler = ....;
DOMConfiguration config = schemaLoader.getConfig();
config.setParameter("error-handler", errorHandler);

// Optional. Specify XML catalog resolver.
// This may be needed to redirect internal DTD/schema file references
XMLCatalogResolver catalogResolver = ...;
config.setParameter("resource-resolver", catalogResolver);

String xsdURI = ...; // the location of schema file

// read schema
XSModel xsModel = schemaLoader.loadURI(xsdURI);

// PROCESS SCHEMA (here, you can do anything you want)

XSNamedMap xsMap;

// 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);
  ...
}

// 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);
  ...
}

// 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);
  ...
}

...
Другие вопросы по тегам