Найти элементы, которые можно повторить в 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);
...
}
...