使用Java查找可在xml架构中重复的项目

我想从XML模式中推导出一对(parentTag, childTag) ,以便允许parentTagparentTag多个实例包含为直接子项。

手动完成,我在模式中查找maxOccurs属性,查看元素标记和直接父标记。

例如,来自

        

我应该得到夫妇(A,B)(ANOTHER,B) (A,B) (ANOTHER,B)

我有一个使用XSLT的工作解决方案将我的架构转换为这样的(parentTag, childTag)夫妇的列表。

在Java中有一种优雅的方法吗? 您建议使用哪个库来实现此目的?

要使用Java(不使用XSLT)处理XML模式,我们使用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); ... } ...