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

9 浏览
0 Comments

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

我想从XML模式中推导出(parentTag, childTag)这样的对偶,以便parentTag可以包含多个childTag作为直接子项。

手动完成这个任务时,我会查找模式中的maxOccurs属性,查看元素标签和直接父标签。

例如,从以下示例中:


     
          
     



我应该得到(A,B)(ANOTHER,B)这两对。

我有一个使用XSLT将模式转换为这种(parentTag, childTag)对的列表的解决方案。

在Java中有没有一种优雅的方式来做这个?你会推荐使用哪个库来实现这个?

0
0 Comments

在Java中处理XML模式(无需使用XSLT),我们使用Xerces2 Java解析器。我们可能需要以下软件包/类:

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文件的过程如下:

// 获取XML Schema实现
XSImplementation impl = (XSImplementation)
  (new DOMXSImplementationSourceImpl()).getDOMImplementation(XMLConstants.XSD_LOADER_NAME);
// 获取模式加载器
XSLoader schemaLoader = impl.createXSLoader (null);
// 可选。指定错误处理程序
DOMErrorHandler errorHandler = ....;
DOMConfiguration config = schemaLoader.getConfig();
config.setParameter("error-handler", errorHandler);
// 可选。指定XML目录解析器。
// 这可能需要重定向内部DTD/模式文件引用
XMLCatalogResolver catalogResolver = ...;
config.setParameter("resource-resolver", catalogResolver);
String xsdURI = ...; // 模式文件的位置
// 读取模式
XSModel xsModel = schemaLoader.loadURI(xsdURI);
// 处理模式(在这里,您可以做任何您想做的事情)
XSNamedMap xsMap;
// 处理顶级元素声明
xsMap = xsModel.getComponents(XSConstants.ELEMENT_DECLARATION);
for (int i = 0; i < xsMap.getLength(); i ++)
{
  XSElementDeclaration xsElementDecl = (XSElementDeclaration) xsMap.item(i);
  ...
}
// 处理顶级类型定义
xsMap = xsModel.getComponents(XSConstants.TYPE_DEFINITION);
for (int i = 0; i < xsMap.getLength(); i ++)
{
  XSTypeDefinition xsTDef = (XSTypeDefinition) xsMap.item(i);
  ...
}
// 处理模型组定义
xsMap = xsModel.getComponents(XSConstants.MODEL_GROUP_DEFINITION);
for (int i = 0; i < xsMap.getLength(); i ++)
{
  XSModelGroupDefinition xsGroupDef = (XSModelGroupDefinition) xsMap.item(i);
  ...
}
...

你好,我试图使用XERCES2根据您的评论,但我在解析过程中无法找到ComplexType内的所有元素。我在这里发表了问题:stackoverflow.com/questions/66856898/…如果您有机会,请查看并提供可能的解决方案。非常感谢 🙂

0