我想从 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 中有没有一种优雅的方法可以做到这一点?您会推荐哪个库来实现此功能?
最佳答案
为了在 Java 中处理 XML 模式(没有 XSLT),我们使用 Xerces2 Java 解析器: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);
...
}
...
关于java - 使用 Java 查找可在 xml 模式中重复的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17471066/