java - 使用 Java 查找可在 xml 模式中重复的项目

标签 java xml xsd

我想从 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/

相关文章:

visual-studio-2010 - 你能在 vs 2010 中根据 xml 验证 xsd 吗?

java - 如何使用 Google Time Zone API 获取 GMT

xml - 对于 XML 中的非默认命名空间,每个标记都应该有一个前缀吗?

java - 为什么 TableRowSorter 弄乱了我的结果?

c# - 为什么我不能将属性转换为嵌套元素?

java - GWT - 将外部 Java 类添加到客户端项目

c# - 在 C# 中嵌入一个 xsd 文件

java - 发现从元素 'elementName' 开始的无效内容。此时不需要子元素

java - 使用自己创建的jar文件时出现ClassNotFoundException

java - 国际象棋压缩 : problems when calling Position#doMove()